Multiplex assessment of protein variant abundance by massively parallel sequencing VAMP-seq - multiplex assay that uses fluorescent reporters to measure the steady-state abundance of protein variants in cultured human cells (each cellexpresses a single variant directly fused to EGFP…the stability of the variant dictates the abundance of the EGFP fusion and, accordingly, the green fluorescence signal of the cell) - used to assess PTEN and TPMT variants

# graph VAMP-seq scores relative to variant position in protein
#pten
pten1_hbond <- pten1_proc[!is.na(pten1_proc$hbond_sum),]
pten1_hbond$secondary_struct <- ifelse(is.na(pten1_hbond$helix), "unknown",
                        ifelse(pten1_hbond$helix==1, "helix",
                        ifelse(pten1_hbond$sheet==1, "sheet",
                        ifelse(pten1_hbond$helix==0, "neither",
                        "unknown"))))
pten_plot_hbond <- ggplot(pten1_hbond, aes(x=hbond_sum, y=score, colour=secondary_struct))+ geom_point(alpha=0.4) + ylab("VAMP-seq score")+xlab("DSSP Sum of hydrogen bonds")+ggtitle("PTEN scores in relation to hydrogen bonding") + scale_color_manual(values=c("#FF4848", "#696969", "#5757FF")) + labs(colour="Secondary Structure") + theme_bw()
plot(pten_plot_hbond)

pten_plot_hbond1 <- ggplot(pten1_hbond, aes(x=hbond_sum, y=score))+ geom_point(alpha = 0.2) + ylab("VAMP-seq score")+xlab("DSSP Sum of hydrogen bonds")+ggtitle("PTEN scores in relation to hydrogen bonding") + theme_bw()
# was in aes, ggplot function call ---> colour=secondary_struct
#scale_color_manual(values=c("#FF4848", "#00C853", "#5757FF", "#A9A9A9")) + labs(colour="Secondary Structure")+
plot(pten_plot_hbond1)

#less hydrogen bonds ~ higher abundance
#method1 (basic, for visualizing in rstudio)
grid.newpage()
grid.draw(rbind(ggplotGrob(tpmt_dssp_schematic), ggplotGrob(tpmt_pos_mean), ggplotGrob(tpmt_heat), size = "last"))
Removed 1 rows containing missing values (geom_segment).Removed 1 rows containing missing values (geom_point).

grid.newpage()
grid.draw(rbind(ggplotGrob(pten_dssp_schematic), ggplotGrob(pten_pos_mean), ggplotGrob(pten_heat), size = "last"))
Removed 12 rows containing missing values (geom_errorbar).

#plotting mean score vs variant changed to 
tpmt_end_sum <- summarySE(tpmt1_proc_wt, measurevar="score", groupvars="end")
tpmt_end_mean <- ggplot(tpmt_end_sum, aes(x=end, y=score)) +
  geom_bar(position=position_dodge(), stat="identity", colour="#999999") +
  geom_errorbar(aes(ymin=score-sd, ymax=score+sd), width=0.001, position=position_dodge()) +
  ylab("mean abundance") + xlab("variant amino acid") + theme_bw()
plot(tpmt_end_mean)

pten_a_spread1 <- ggplot(pten1_proc_wt, aes(y=score, x=factor(position), colour = end)) + geom_violin(draw_quantiles=c(0.5), data=subset(pten1_proc_wt, start== "A"), aes(group=factor(position)), scale = "width") + xlab("Position in PTEN") + ggtitle("Alanine variant abundance scores")+ geom_point(data=subset(pten1_proc_wt, start== "A"), aes(x=factor(position), y=score), alpha = 0.85, position=jitter2) + scale_color_manual(values=twenty_color) + theme_bw()
pten_a_aa <- ggplot(pten1_proc_wt, aes(y=score, x=end, colour = end)) + geom_violin(draw_quantiles=c(0.5), data=subset(pten1_proc_wt, start== "A"), aes(group=end), scale = "width") + xlab("Amino acid") + ggtitle("Alanine variant abundance scores")+ geom_point(data=subset(pten1_proc_wt, start== "A"), aes(x=end, y=score), alpha = 0.75, position=jitter1) + scale_color_manual(values=twenty_color) + theme_bw()
pten_r_spread1 <- ggplot(pten1_proc_wt, aes(y=score, x=factor(position), colour = end)) + geom_violin(draw_quantiles=c(0.5), data=subset(pten1_proc_wt, start== "R"), aes(group=factor(position)), scale = "width") + xlab("Position in PTEN") + ggtitle("Arganine variant abundance scores")+ geom_point(data=subset(pten1_proc_wt, start== "R"), aes(x=factor(position), y=score), alpha = 0.85, position=jitter2) + scale_color_manual(values=twenty_color) + theme_bw()
pten_r_aa <- ggplot(pten1_proc_wt, aes(y=score, x=end, colour = end)) + geom_violin(draw_quantiles=c(0.5), data=subset(pten1_proc_wt, start== "R"), aes(group=end), scale = "width") + xlab("Amino acid") + ggtitle("Arganine variant abundance scores")+ geom_point(data=subset(pten1_proc_wt, start== "R"), aes(x=end, y=score), alpha = 0.75, position=jitter1) + scale_color_manual(values=twenty_color) + theme_bw()
pten_n_spread1 <- ggplot(pten1_proc_wt, aes(y=score, x=factor(position), colour = end)) + geom_violin(draw_quantiles=c(0.5), data=subset(pten1_proc_wt, start== "N"), aes(group=factor(position)), scale = "width") + xlab("Position in PTEN") + ggtitle("Asparagine variant abundance scores")+ geom_point(data=subset(pten1_proc_wt, start== "N"), aes(x=factor(position), y=score), alpha = 0.85, position=jitter2) + scale_color_manual(values=twenty_color) + theme_bw()
pten_n_aa <- ggplot(pten1_proc_wt, aes(y=score, x=end, colour = end)) + geom_violin(draw_quantiles=c(0.5), data=subset(pten1_proc_wt, start== "N"), aes(group=end), scale = "width") + xlab("Amino acid") + ggtitle("Asparagine variant abundance scores")+ geom_point(data=subset(pten1_proc_wt, start== "N"), aes(x=end, y=score), alpha = 0.75, position=jitter1) + scale_color_manual(values=twenty_color) + theme_bw()
pten_d_spread1 <- ggplot(pten1_proc_wt, aes(y=score, x=factor(position), colour = end)) + geom_violin(draw_quantiles=c(0.5), data=subset(pten1_proc_wt, start== "D"), aes(group=factor(position)), scale = "width") + xlab("Position in PTEN") + ggtitle("Aspartic Acid variant abundance scores")+ geom_point(data=subset(pten1_proc_wt, start== "D"), aes(x=factor(position), y=score), alpha = 0.85, position=jitter2) + scale_color_manual(values=twenty_color) + theme_bw()
pten_d_aa <- ggplot(pten1_proc_wt, aes(y=score, x=end, colour = end)) + geom_violin(draw_quantiles=c(0.5), data=subset(pten1_proc_wt, start== "D"), aes(group=end), scale = "width") + xlab("Amino acid") + ggtitle("Aspartic Acid variant abundance scores")+ geom_point(data=subset(pten1_proc_wt, start== "D"), aes(x=end, y=score), alpha = 0.75, position=jitter1) + scale_color_manual(values=twenty_color) + theme_bw()
pten_n_hydrodiff <- ggplot(pten1_proc_wt, aes(y=score, x=factor(position), colour = (hydro2-hydro1))) + geom_violin(draw_quantiles=c(0.5), data=subset(pten1_proc_wt, start== "N"), aes(group=factor(position)), scale = "width") + xlab("Position in PTEN") + ggtitle("Asparagine variant abundance scores w/ hydrophobicity change")+ geom_point(data=subset(pten1_proc_wt, start== "N"), aes(x=factor(position), y=score), alpha = 0.85, position=jitter2) + scale_color_distiller(palette = "Spectral") + theme_bw()
pten_d_hydrodiff <- ggplot(pten1_proc_wt, aes(y=score, x=factor(position), colour = (hydro2-hydro1))) + geom_violin(draw_quantiles=c(0.5), data=subset(pten1_proc_wt, start== "D"), aes(group=factor(position)), scale = "width") + xlab("Position in PTEN") + ggtitle("Aspartic Acid variant abundance scores w/ hydrophobicity change")+ geom_point(data=subset(pten1_proc_wt, start== "D"), aes(x=factor(position), y=score), alpha = 0.85, position=jitter2) + scale_color_distiller(palette = "Spectral") + theme_bw()
plot(pten_a_spread1)

plot(pten_a_aa)

plot(pten_r_spread1)

plot(pten_r_aa)

plot(pten_n_spread1)

plot(pten_n_hydrodiff)

plot(pten_n_aa)

plot(pten_d_spread1)

plot(pten_d_hydrodiff)

plot(pten_d_aa)

ggplot(pten1_proc_wt, aes(y=score, x=factor(position), colour = end)) + geom_violin(draw_quantiles=c(0.5), data=subset(pten1_proc_wt, start== "P"), aes(group=factor(position)), scale = "width") + xlab("Position in PTEN") + ggtitle("Proline variant abundance scores")+ geom_point(data=subset(pten1_proc_wt, start== "P"), aes(x=factor(position), y=score), alpha = 0.85, position=jitter2) + scale_color_manual(values=twenty_color) + theme_bw()

ggplot(pten1_proc_wt, aes(y=score, x=end, colour = end)) + geom_violin(draw_quantiles=c(0.5), data=subset(pten1_proc_wt, start== "P"), aes(group=end), scale = "width") + xlab("Amino acid") + ggtitle("Proline variant abundance scores")+ geom_point(data=subset(pten1_proc_wt, start== "P"), aes(x=end, y=score), alpha = 0.75, position=jitter1) + scale_color_manual(values=twenty_color) + theme_bw()

ggplot(pten1_proc_wt, aes(y=score, x=factor(position), colour = (hydro2-hydro1))) + geom_violin(draw_quantiles=c(0.5), data=subset(pten1_proc_wt, start== "P"), aes(group=factor(position)), scale = "width") + xlab("Position in PTEN") + ggtitle("Proline variant abundance scores w/ hydrophobicity change")+ geom_point(data=subset(pten1_proc_wt, start== "P"), aes(x=factor(position), y=score), alpha = 0.85, position=jitter2) + scale_color_distiller(palette = "Spectral") + theme_bw()

ggplot(pten1_proc_wt, aes(y=score, x=factor(position), colour = end)) + geom_violin(draw_quantiles=c(0.5), data=subset(pten1_proc_wt, start== "T"), aes(group=factor(position)), scale = "width") + xlab("Position in PTEN") + ggtitle("T variant abundance scores")+ geom_point(data=subset(pten1_proc_wt, start== "T"), aes(x=factor(position), y=score), alpha = 0.85, position=jitter2) + scale_color_manual(values=twenty_color) + theme_bw()

ggplot(pten1_proc_wt, aes(y=score, x=end, colour = end)) + geom_violin(draw_quantiles=c(0.5), data=subset(pten1_proc_wt, start== "T"), aes(group=end), scale = "width") + xlab("Amino acid") + ggtitle("T variant abundance scores")+ geom_point(data=subset(pten1_proc_wt, start== "T"), aes(x=end, y=score), alpha = 0.75, position=jitter1) + scale_color_manual(values=twenty_color) + theme_bw()

ggplot(pten1_proc_wt, aes(y=score, x=factor(position), colour = (hydro2-hydro1))) + geom_violin(draw_quantiles=c(0.5), data=subset(pten1_proc_wt, start== "T"), aes(group=factor(position)), scale = "width") + xlab("Position in PTEN") + ggtitle("T variant abundance scores w/ hydrophobicity change")+ geom_point(data=subset(pten1_proc_wt, start== "T"), aes(x=factor(position), y=score), alpha = 0.85, position=jitter2) + scale_color_distiller(palette = "Spectral") + theme_bw()

#in order to find position with low stddev (excluding nonsense)
pten_variance <- summarySE((subset(pten1_data, end != "X")), measurevar="score", groupvars="position", na.rm=TRUE)
NaNs produced
#adjust N (minimum # variants at a position) and stddev
#5, 0.11
#10, 0.15
pten_variance_filtered <- subset(subset(pten_variance, N > 8 ), sd < 0.11)
pten_variance_filtered$position
 [1]  16  18  20  21  75 204 252 274 276 277 294 329 387 388 397
#nonsense variant scores are graphed as dots, but are not included in the overlaying violin plots
ggplot(no_nonsense, aes(y=score, x=factor(position), colour = end)) + 
  geom_violin(draw_quantiles=c(0.5), data=subset(no_nonsense, no_nonsense$position %in% pten_variance_filtered$position), aes(group=factor(position)), scale = "width") + 
  xlab("Position in PTEN") + ggtitle("Intolerant and tolerant amino acid positions") +
  geom_point(data=subset(pten1_proc_wt, pten1_proc_wt$position %in% pten_variance_filtered$position), aes(x=factor(position), y=score), alpha = 0.85, position=jitter1) + scale_color_manual(values=twenty_color) + theme_bw()

ggplot(no_nonsense, aes(y=score, x=position, colour = end)) + 
  geom_violin(draw_quantiles=c(0.5), data=subset(no_nonsense, no_nonsense$position %in% pten_variance_filtered$position), aes(group=position%%450), scale = "width") + 
  xlab("Position in PTEN") + ggtitle("Intolerant and tolerant amino acid positions") +
  geom_point(data=subset(pten1_proc_wt, pten1_proc_wt$position %in% pten_variance_filtered$position), aes(x=position, y=score), alpha = 0.85, position=jitter1) + scale_color_manual(values=twenty_color) + theme_bw()

#diff parameter 
pten_variance_filtered1 <- subset(subset(pten_variance, N > 10), sd > 0.25)
no_nonsense1 <- subset(pten1_proc_wt, end != "X")
#nonsense variant scores are graphed as dots, but are not included in the overlaying violin plots
ggplot(no_nonsense1, aes(y=score, x=factor(position), colour = end)) + 
  geom_violin(draw_quantiles=c(0.5), data=subset(no_nonsense1, no_nonsense1$position %in% pten_variance_filtered1$position), aes(group=factor(position)), scale = "width") + 
  xlab("Position in PTEN") + ggtitle("Intolerant and tolerant amino acid positions") +
  geom_point(data=subset(pten1_proc_wt, pten1_proc_wt$position %in% pten_variance_filtered1$position), aes(x=factor(position), y=score), alpha = 0.85, position=jitter1) + scale_color_manual(values=twenty_color) + theme_bw()

ggplot(no_nonsense1, aes(y=score, x=position, colour = end)) + 
  geom_violin(draw_quantiles=c(0.5), data=subset(no_nonsense1, no_nonsense1$position %in% pten_variance_filtered1$position), aes(group=position%%450), scale = "width") + 
  xlab("Position in PTEN") + ggtitle("Intolerant and tolerant amino acid positions") +
  geom_point(data=subset(pten1_proc_wt, pten1_proc_wt$position %in% pten_variance_filtered1$position), aes(x=position, y=score), alpha = 0.85, position=jitter1) + scale_color_manual(values=twenty_color) + theme_bw()

chosen <- c(61, 68, 105, 108, 123, 127, 130, 132, 135, 155, 165, 173, 174, 246, 323, 335)
ggplot(pten1_proc_wt, aes(y=score, x=factor(position), colour = end)) + 
  geom_violin(draw_quantiles=c(0.5), data=subset(pten1_proc_wt, pten1_proc_wt$position %in% chosen), aes(group=factor(position)), scale = "width") + 
  xlab("Position in PTEN") + ggtitle("Clinvar path/likely path variant positions") +
  geom_point(data=subset(pten1_proc_wt, pten1_proc_wt$position %in% chosen), aes(x=factor(position), y=score), alpha = 0.85, position=jitter1) + scale_color_manual(values=twenty_color) + theme_bw()

#pten_pos_mean <- ggplot(pten_sum, aes(x=position, y=score))+ geom_bar(position=position_dodge(), stat="identity", colour="#999999") + geom_errorbar(aes(ymin=score-sd, ymax = score+sd), width=1, size=0.3, position=position_dodge()) +ylab("VAMP-seq score")+theme(axis.title.x = element_blank(), axis.text.x = element_blank()) + scale_x_continuous(breaks = seq(0, 403, 20), expand = c(0,0)) + scale_y_continuous(expand = c(0,0)) + geom_vline(xintercept=185, color="black", size=.1) + geom_vline(xintercept=350, color="black", size=.1)
#pretty trashy
ggplot(no_nonsense, aes(y=score, x=position)) + 
  geom_bar(data=subset(no_nonsense1, no_nonsense$position %in% pten_variance_filtered1$position), position=position_dodge(), stat="identity", colour="#999999") +
  geom_errorbar(data=subset(no_nonsense1, no_nonsense$position %in% pten_variance_filtered1$position), aes(ymin=score-sd, ymax=score+sd), width=1, size=0.3, position=position_dodge()) +
  #geom_violin(draw_quantiles=c(0.5), data=subset(no_nonsense1, no_nonsense1$position %in% pten_variance_filtered1$position), aes(group=position%%450), scale = "width") + 
  xlab("Position in PTEN") + ggtitle("Intolerant and tolerant amino acid positions") +
  #geom_point(data=subset(pten1_proc_wt, pten1_proc_wt$position %in% pten_variance_filtered1$position), aes(x=position, y=score), alpha = 0.85, position=jitter1) +
  #scale_color_manual(values=twenty_color) + 
  scale_x_continuous(breaks = seq(0, 403, 20), expand = c(0,0)) + scale_y_continuous(expand = c(0,0))+theme(axis.title.x = element_blank(), axis.text.x = element_blank(), legend.position="none")

pten_variance_filtered2 <- subset(subset(pten_variance, N > 10), sd > 0.35)
ggplot(no_nonsense, aes(y=sd, x=position)) +
  geom_bar(data=subset(no_nonsense, no_nonsense$position %in% pten_variance_filtered$position), position=position_dodge(), stat="identity", colour="#999999")

#all sd over .25, N>10
ggplot(pten_sum, aes(y=sd, x=position)) +
  geom_point(data=subset(pten_sum, pten_sum$position %in% pten_variance_filtered1$position)) +
  #geom_errorbar(data=subset(no_nonsense, no_nonsense$position %in% pten_variance_filtered2$position), aes(ymin=score-sd, ymax = score+sd), width=1, size=0.3, position=position_dodge()) + 
  scale_x_continuous(breaks = seq(0, 403, 20), expand = c(0,0)) + scale_y_continuous(expand = c(0,0))+theme(axis.title.x = element_blank(), axis.text.x = element_blank(), legend.position="none")

#this is how _ is defined: pten_variance <- summarySE((subset(pten1_data, end != "X")), measurevar="score", groupvars="position", na.rm=TRUE)
pten_variance_filtered4 <-subset(pten_variance, N>5)
variance_bar <- ggplot(pten_variance_filtered4, aes(y=sd, x=position)) +
  geom_segment(aes(x=position, xend=position, y=0, yend=sd), color="grey68") +
  geom_point(size=0.5) +
  scale_x_continuous(breaks = seq(0, 403, 20), expand = c(0,0)) + scale_y_continuous(expand = c(0,0))+theme(axis.title.x = element_blank(), axis.text.x = element_blank(), legend.position="none")
plot(variance_bar)

#all sd
ggplot(pten_sum, aes(y=sd, x=position)) +
  geom_segment(aes(x=position, xend=position, y=0, yend=sd), color="grey48") +
  #geom_point() +
  #geom_errorbar(data=subset(no_nonsense, no_nonsense$position %in% pten_variance_filtered2$position), aes(ymin=score-sd, ymax = score+sd), width=1, size=0.3, position=position_dodge()) + 
  scale_x_continuous(breaks = seq(0, 403, 20), expand = c(0,0)) + scale_y_continuous(expand = c(0,0))+theme(axis.title.x = element_blank(), axis.text.x = element_blank(), legend.position="none")

NA
pten_sum_filt <- pten_sum
pten_sum_filt$sd2 = pten_variance_filtered4[match(pten_sum_filt$position, pten_variance_filtered4$position), "sd"]
pten_pos_colored_mean <- ggplot(pten_sum_filt, aes(x=position, y=score))+ geom_bar(position=position_dodge(), stat="identity", colour=pten_sum_filt$sd2) + geom_errorbar(aes(ymin=score-sd, ymax = score+sd), width=1, size=0.3, position=position_dodge()) +ylab("VAMP-seq score")+theme(axis.title.x = element_blank(), axis.text.x = element_blank()) + scale_x_continuous(breaks = seq(0, 403, 20), expand = c(0,0)) + scale_y_continuous(expand = c(0,0)) + geom_vline(xintercept=185, color="black", size=.1) + geom_vline(xintercept=350, color="black", size=.1)+ scale_colour_gradient(low = "white", high = "yellow")
plot(pten_pos_colored_mean)

#method2 (use for final layout, size specification, download)
gd=ggplot_gtable(ggplot_build(variance_bar))
maxWidth = grid::unit.pmax(ga$widths, gb$widths, gc$widths, gd$widths)
ga$widths <- as.list(maxWidth)
gb$widths <- as.list(maxWidth)
gc$widths <- as.list(maxWidth)
gd$widths <- as.list(maxWidth)
grid.newpage()

#storing, with specified widths!!
pdf('pten_tpmt_mean_heat_variance.pdf', width=8, height=6)
#grid.arrange(arrangeGrob(gC,gA,gB,nrow=3,heights=c(.1,.3,.8)))
grid.arrange(arrangeGrob(gc,gd,ga,gb,nrow=4,heights=c(.1,.15,.15,.6)))
dev.off()
quartz_off_screen 
                3 

#Identifying items in tail to investigate
pten1_nonsense <- subset(pten1_proc, class == "nonsense")
tpmt1_nonsense <- subset(tpmt1_proc, class == "nonsense")
pten1_synon <- subset(pten1_proc, class == "synonymous")
tpmt1_synon <- subset(tpmt1_proc, class == "synonymous")
pten1_no_missense <- subset(pten1_proc, class == "synonymous" | class == "nonsense")
ggplot(pten1_nonsense, aes(x=score)) + geom_histogram(binwidth=.01, colour="blue", fill="white") + theme_bw()

#+ geom_density()
ggplot(pten1_synon, aes(x=score)) + geom_histogram(binwidth=.01, colour="red", fill="white") + theme_bw()

ggplot(pten1_proc_wt, aes(x=score)) + geom_histogram(data=subset(pten1_proc_wt,class == "nonsense"), fill = "red", alpha = 0.5, binwidth=.01) + geom_histogram(data=subset(pten1_proc_wt,class == "synonymous"), fill = "blue", alpha = 0.5, binwidth=.01) + geom_histogram(data=subset(pten1_proc_wt,class == "missense"), fill = "green", alpha = 0.2, binwidth=.01) + theme_bw()

ggplot(pten1_no_missense, aes(x=score)) + geom_histogram(data=subset(pten1_no_missense,class == "nonsense"), fill = "red", alpha = 0.5, binwidth=.01) + geom_histogram(data=subset(pten1_no_missense,class == "synonymous"), fill = "blue", alpha = 0.5, binwidth=.01) + theme_bw()

ggplot(tpmt1_synon, aes(x=score)) + geom_histogram(binwidth=.01, colour="red", fill="white") + theme_bw()

ggplot(tpmt1_nonsense, aes(x=score)) + geom_histogram(binwidth=.01, colour="blue", fill="white") + theme_bw()

#0.55
nonsense_tail <- subset(pten1_nonsense, score > 0.6)
synon_tail <- subset(pten1_synon, score < 0.6)
nonsense_tail$secondary_struct <- ifelse(is.na(nonsense_tail$helix), "unknown",
                        ifelse(nonsense_tail$helix==1, "helix",
                        ifelse(nonsense_tail$sheet==1, "sheet",
                        ifelse(nonsense_tail$helix==0, "neither",
                        "unknown"))))
synon_tail$secondary_struct <- ifelse(is.na(synon_tail$helix), "unknown",
                        ifelse(synon_tail$helix==1, "helix",
                        ifelse(synon_tail$sheet==1, "sheet",
                        ifelse(synon_tail$helix==0, "neither",
                        "unknown"))))
#data[row,column]
n_tail <- nonsense_tail[,c(1,2,7,30,127)]
s_tail <- synon_tail[,c(1,2,7,30,127)]
n_tail$bp_pos <- (n_tail$position-1)*3
s_tail$bp_pos <- (s_tail$position-1)*3
n_tail
s_tail
#just in case there is a discernible pattern
s_tail_pos <- ggplot(s_tail, aes(x=position, y=score, colour=secondary_struct))+ geom_point(size=.3) + scale_x_continuous(minor_breaks = seq(0, 405, 5)) + scale_color_manual(values=c("#FF4848", "#00C853", "#5757FF", "#A9A9A9")) +ylab("VAMP-seq score")+xlab("Position in PTEN")+labs(colour="Secondary Structure")+ggtitle("PTEN synonymous variant tail scores in relation to protein structure") + geom_vline(xintercept=47, color="black", size=.1) + geom_vline(xintercept=78, color="black", size=.1) + geom_vline(xintercept=122.5, color="black", size=.1) + geom_vline(xintercept=140, color="black", size=.1) + geom_vline(xintercept=165, color="black", size=.1) + geom_vline(xintercept=194, color="black", size=.1) + geom_vline(xintercept=209, color="black", size=.1) + theme_bw()
plot(s_tail_pos)

#help visualizing NMD rules
n_tail_pos <- ggplot(n_tail, aes(x=position, y=score, colour=secondary_struct))+ geom_point(size=.3) + scale_x_continuous(minor_breaks = seq(0, 405, 5)) + scale_color_manual(values=c("#FF4848", "#00C853", "#5757FF", "#A9A9A9")) +ylab("VAMP-seq score")+xlab("Position in PTEN")+labs(colour="Secondary Structure")+ggtitle("PTEN nonsense variant tail scores in relation to protein structure") + geom_vline(xintercept=47, color="black", size=.1) + geom_vline(xintercept=78, color="black", size=.1) + geom_vline(xintercept=122.5, color="black", size=.1) + geom_vline(xintercept=140, color="black", size=.1) + geom_vline(xintercept=165, color="black", size=.1) + geom_vline(xintercept=194, color="black", size=.1) + geom_vline(xintercept=209, color="black", size=.1) + theme_bw()
plot(n_tail_pos)

TPMT_abun_CADD <- ggplot(tpmt_merge, aes(x=abundance_class, y=CADD_raw_rankscore)) + geom_violin(draw_quantiles = c( 0.5))+ylab("CADD raw rankscore")+xlab("Abundance Class") + theme_bw()
plot(TPMT_abun_CADD)

TPMT_abun_SIFT_conv <- ggplot(tpmt_merge, aes(x=abundance_class, y=as.numeric(SIFT_converted_rankscore))) + geom_violin(draw_quantiles = c(0.5))+ylab("SIFT conv rankscore")+xlab("Abundance Class") + theme_bw()
plot(TPMT_abun_SIFT_conv)

TPMT_abun_POLY <- ggplot(tpmt_merge, aes(x=abundance_class, y=as.numeric(Polyphen2_HDIV_rankscore))) + geom_violin(draw_quantiles = c( 0.5))+ylab("Polyphen2 HDIV rankscore")+xlab("Abundance Class") + theme_bw()
plot(TPMT_abun_POLY)

TPMT_abun_POLY1 <- ggplot(tpmt_merge, aes(x=abundance_class, y=as.numeric(Polyphen2_HVAR_rankscore))) + geom_violin(draw_quantiles = c( 0.5))+ylab("Polyphen2 HVAR rankscore")+xlab("Abundance Class") + theme_bw()
plot(TPMT_abun_POLY1)

Pred_abun_SIFT <- ggplot(tpmt_merge, aes(abundance_class)) + geom_bar(aes(fill = SIFT_pred)) + ggtitle("Abundance class vs SIFT prediction of Damaging or Tolerated") + theme_bw()
plot(Pred_abun_SIFT)

trial_sep <- tpmt_merge[c(21,23,24,26)]
tpmt_merge_expand <- separate_rows(tpmt_merge, c("Polyphen2_HDIV_score", "Polyphen2_HDIV_pred", "Polyphen2_HVAR_score", "Polyphen2_HVAR_pred"))
Pred_abun_HVAR <- ggplot(tpmt_merge_expand, aes(abundance_class)) + geom_bar(aes(fill = Polyphen2_HVAR_pred)) + ggtitle("Abundance class vs Polyphen2 HVAR predictions") + labs(subtitle = "D: Probably Damaging, P: Possibly Damaging, B: Benign") + theme_bw()
plot(Pred_abun_HVAR)

twenty_color1 = c("#D02028", "#A4C33B","#53958B", "#E6A3B4", "#C5A0CA", "#554DA0", "#99247E", "#402059", "#82421B", "#7E807E", 'black', "#EDD941", "#F2F08E", "#EEC898", "#E1A12F", "#76C158",  "#BCDDAE", "#85782E", "#315935", "#A1DAE0", "#486EB6")
pten_dssp_schematic1 <- ggplot() +
  geom_segment(aes(x = 1, y = 0, xend = max(pten_extra$position)), yend = 0, size = 1, color = "grey70") +
  geom_point(data = subset(pten_extra, !is.na(xca)), aes(x = position, y = 0), color = "black", size = 1.8) +
  geom_point(data = subset(pten_extra, sheet == 1), aes(x = position, y = 0), color = "pink", size = 1.5) +
  geom_point(data = subset(pten_extra, helix == 1), aes(x = position, y = 0), color = "cyan", size = 1.5) +
  scale_x_continuous(breaks = seq(0, 403, 20), expand = c(0,0)) +
  scale_y_continuous(breaks = NULL, expand = c(0,0)) +xlab("Position in PTEN") + ylab("\n \n \n") +
  theme(panel.border = element_blank(), axis.text.y = element_blank())

aas <- c("A", "C", "P", "X")
aas1 <- c("S", "C", "P", "X")
aas2 <- c("A", "C", "D", "E", "F", "G", "H", "I", "K", "L", "M", "N", "P", "Q", "R", "S", "T", "V", "W", "Y")
pten_a_pos <- ggplot(data=subset(pten1_proc_wt, end=="A"), aes(x=position, y=score, colour=start))+ geom_point(data=subset(pten1_proc_wt, end=="A" & start %in% aas2), size=.6) + scale_x_continuous(breaks=seq(0, 403, 20), minor_breaks = seq(0, 403, 5), limits = c(0, 403), expand = c(0,0)) + scale_y_continuous(expand = c(0,0), limits = c(-0.25, 1.5)) + scale_color_manual(values=twenty_color1) +ylab("Abundance score")+labs(colour="Reference amino acid")+xlab(NULL)+ggtitle("Abundance scores of Alanine variants") + theme(axis.text.x = element_blank(), legend.position='top') + geom_hline(yintercept=1, color="black", size=.1)
#plot(pten_a_pos)

pten_s_pos <- ggplot(data=subset(pten1_proc_wt, end=="S"), aes(x=position, y=score, colour=start))+ geom_point(data=subset(pten1_proc_wt, end=="S" & start %in% aas2), size=.6) + scale_x_continuous(breaks=seq(0, 403, 20), minor_breaks = seq(0, 403, 5), limits = c(0, 403), expand = c(0,0)) + scale_y_continuous(expand = c(0,0), limits = c(-0.25, 1.5)) + scale_color_manual(values=twenty_color1) +ylab("Abundance score")+labs(colour="Reference amino acid")+xlab(NULL)+ggtitle("Abundance scores of Serine variants") + theme(axis.text.x = element_blank(), legend.position='top') + geom_hline(yintercept=1, color="black", size=.1)

pten_c_pos <- ggplot(data=subset(pten1_proc_wt, end=="C"), aes(x=position, y=score, colour=start))+ geom_point(data=subset(pten1_proc_wt, end=="C" & start %in% aas2), size=.6) + scale_x_continuous(breaks=seq(0, 403, 20), minor_breaks = seq(0, 403, 5), limits = c(0, 403), expand = c(0,0)) + scale_y_continuous(expand = c(0,0), limits = c(-0.25, 1.5)) + scale_color_manual(values=twenty_color1) +ylab("Abundance score")+labs(colour="Reference amino acid")+xlab(NULL)+ggtitle("Abundance scores of Cysteine variants") + theme(axis.text.x = element_blank(), legend.position='top') + geom_hline(yintercept=1, color="black", size=.1)


pten_x_pos <- ggplot(data=subset(pten1_proc_wt, end=="X"), aes(x=position, y=score, colour=start))+ geom_point(data=subset(pten1_proc_wt, end=="X" & start %in% aas2), size=.6) + scale_x_continuous(breaks=seq(0, 403, 20), minor_breaks = seq(0, 403, 5), limits = c(0, 403), expand = c(0,0)) + scale_y_continuous(expand = c(0,0), limits = c(-0.25, 1.5)) + scale_color_manual(values=twenty_color1) +ylab("Abundance score")+labs(colour="Reference amino acid")+xlab(NULL)+ggtitle("Abundance scores of nonsense variants") + theme(axis.text.x = element_blank(), legend.position='top') + geom_hline(yintercept=1, color="black", size=.1)

grid.newpage()
grid.draw(rbind(ggplotGrob(pten_a_pos), ggplotGrob(pten_dssp_schematic1), size = "last"))
grid.newpage()
grid.draw(rbind(ggplotGrob(pten_s_pos), ggplotGrob(pten_dssp_schematic1), size = "last"))
grid.newpage()
grid.draw(rbind(ggplotGrob(pten_c_pos), ggplotGrob(pten_dssp_schematic1), size = "last"))
grid.newpage()
grid.draw(rbind(ggplotGrob(pten_x_pos), ggplotGrob(pten_dssp_schematic1), size = "last"))
#snake at the end (arches over grey region)
pten_p_pos <- ggplot(data=subset(pten1_proc_wt, end=="P"), aes(x=position, y=score, colour=start))+ geom_point(data=subset(pten1_proc_wt, end=="P" & start %in% aas2), size=.6) + scale_x_continuous(breaks=seq(0, 403, 20), minor_breaks = seq(0, 403, 5), limits = c(0, 403), expand = c(0,0)) + scale_y_continuous(expand = c(0,0), limits = c(-0.25, 1.5)) + scale_color_manual(values=twenty_color1) +ylab("Abundance score")+labs(colour="Reference amino acid")+xlab(NULL)+ggtitle("Abundance scores of Proline variants") + theme(axis.text.x = element_blank(), legend.position='top') + geom_hline(yintercept=1, color="black", size=.1)
grid.newpage()
grid.draw(rbind(ggplotGrob(pten_p_pos), ggplotGrob(pten_dssp_schematic1), size = "last"))

twenty_color1 = c("#D02028", "#A4C33B","#53958B", "#E6A3B4", "#C5A0CA", "#554DA0", "#99247E", "#402059", "#82421B", "#7E807E", 'black', "#EDD941", "#F2F08E", "#EEC898", "#E1A12F", "#76C158",  "#BCDDAE", "#85782E", "#315935", "#A1DAE0", "#486EB6")
pten_dssp_schematic1 <- ggplot() +
  geom_segment(aes(x = 1, y = 0, xend = max(pten_extra$position)), yend = 0, size = 1, color = "grey70") +
  geom_point(data = subset(pten_extra, !is.na(xca)), aes(x = position, y = 0), color = "black", size = 1.8) +
  geom_point(data = subset(pten_extra, sheet == 1), aes(x = position, y = 0), color = "pink", size = 1.5) +
  geom_point(data = subset(pten_extra, helix == 1), aes(x = position, y = 0), color = "cyan", size = 1.5) +
  scale_x_continuous(breaks = seq(0, 403, 20), expand = c(0,0)) +
  scale_y_continuous(breaks = NULL, expand = c(0,0)) +xlab("Position in PTEN") + ylab("\n \n \n") +
  theme(panel.border = element_blank(), axis.text.y = element_blank())
aas <- c("A", "C", "P", "X")
aas1 <- c("S", "C", "P", "X")
aas2 <- c("A", "C", "D", "E", "F", "G", "H", "I", "K", "L", "M", "N", "P", "Q", "R", "S", "T", "V", "W", "Y")
pten_a_pos <- ggplot(data=subset(pten1_proc_wt, end=="A"), aes(x=position, y=score, colour=start))+ geom_point(data=subset(pten1_proc_wt, end=="A" & start %in% aas2), size=.6) + scale_x_continuous(breaks=seq(0, 403, 20), minor_breaks = seq(0, 403, 5), limits = c(0, 403), expand = c(0,0)) + scale_y_continuous(expand = c(0,0), limits = c(-0.25, 1.5)) + scale_color_manual(values=twenty_color1) +ylab("Abundance score")+labs(colour="Reference amino acid")+xlab(NULL)+ggtitle("Abundance scores of Alanine variants") + theme(axis.text.x = element_blank(), legend.position='top') + geom_hline(yintercept=1, color="black", size=.1)
#plot(pten_a_pos)
pten_s_pos <- ggplot(data=subset(pten1_proc_wt, end=="S"), aes(x=position, y=score, colour=start))+ geom_point(data=subset(pten1_proc_wt, end=="S" & start %in% aas2), size=.6) + scale_x_continuous(breaks=seq(0, 403, 20), minor_breaks = seq(0, 403, 5), limits = c(0, 403), expand = c(0,0)) + scale_y_continuous(expand = c(0,0), limits = c(-0.25, 1.5)) + scale_color_manual(values=twenty_color1) +ylab("Abundance score")+labs(colour="Reference amino acid")+xlab(NULL)+ggtitle("Abundance scores of Serine variants") + theme(axis.text.x = element_blank(), legend.position='top') + geom_hline(yintercept=1, color="black", size=.1)
pten_c_pos <- ggplot(data=subset(pten1_proc_wt, end=="C"), aes(x=position, y=score, colour=start))+ geom_point(data=subset(pten1_proc_wt, end=="C" & start %in% aas2), size=.6) + scale_x_continuous(breaks=seq(0, 403, 20), minor_breaks = seq(0, 403, 5), limits = c(0, 403), expand = c(0,0)) + scale_y_continuous(expand = c(0,0), limits = c(-0.25, 1.5)) + scale_color_manual(values=twenty_color1) +ylab("Abundance score")+labs(colour="Reference amino acid")+xlab(NULL)+ggtitle("Abundance scores of Cysteine variants") + theme(axis.text.x = element_blank(), legend.position='top') + geom_hline(yintercept=1, color="black", size=.1)
pten_x_pos <- ggplot(data=subset(pten1_proc_wt, end=="X"), aes(x=position, y=score, colour=start))+ geom_point(data=subset(pten1_proc_wt, end=="X" & start %in% aas2), size=.6) + scale_x_continuous(breaks=seq(0, 403, 20), minor_breaks = seq(0, 403, 5), limits = c(0, 403), expand = c(0,0)) + scale_y_continuous(expand = c(0,0), limits = c(-0.25, 1.5)) + scale_color_manual(values=twenty_color1) +ylab("Abundance score")+labs(colour="Reference amino acid")+xlab(NULL)+ggtitle("Abundance scores of nonsense variants") + theme(axis.text.x = element_blank(), legend.position='top') + geom_hline(yintercept=1, color="black", size=.1)
grid.newpage()
grid.draw(rbind(ggplotGrob(pten_a_pos), ggplotGrob(pten_dssp_schematic1), size = "last"))

grid.newpage()
grid.draw(rbind(ggplotGrob(pten_s_pos), ggplotGrob(pten_dssp_schematic1), size = "last"))

grid.newpage()
grid.draw(rbind(ggplotGrob(pten_c_pos), ggplotGrob(pten_dssp_schematic1), size = "last"))

grid.newpage()
grid.draw(rbind(ggplotGrob(pten_x_pos), ggplotGrob(pten_dssp_schematic1), size = "last"))

#snake at the end (arches over grey region)
pten_p_pos <- ggplot(data=subset(pten1_proc_wt, end=="P"), aes(x=position, y=score, colour=start))+ geom_point(data=subset(pten1_proc_wt, end=="P" & start %in% aas2), size=.6) + scale_x_continuous(breaks=seq(0, 403, 20), minor_breaks = seq(0, 403, 5), limits = c(0, 403), expand = c(0,0)) + scale_y_continuous(expand = c(0,0), limits = c(-0.25, 1.5)) + scale_color_manual(values=twenty_color1) +ylab("Abundance score")+labs(colour="Reference amino acid")+xlab(NULL)+ggtitle("Abundance scores of Proline variants") + theme(axis.text.x = element_blank(), legend.position='top') + geom_hline(yintercept=1, color="black", size=.1)
grid.newpage()
grid.draw(rbind(ggplotGrob(pten_p_pos), ggplotGrob(pten_dssp_schematic1), size = "last"))

#matching snake at the end!
pten_g_pos <- ggplot(data=subset(pten1_proc_wt, end=="G"), aes(x=position, y=score, colour=start))+ geom_point(data=subset(pten1_proc_wt, end=="G" & start %in% aas2), size=.6) + scale_x_continuous(breaks=seq(0, 403, 20), minor_breaks = seq(0, 403, 5), limits = c(0, 403), expand = c(0,0)) + scale_y_continuous(expand = c(0,0), limits = c(-0.25, 1.5)) + scale_color_manual(values=twenty_color1) +ylab("Abundance score")+labs(colour="Reference amino acid")+xlab(NULL)+ggtitle("Abundance scores of Glycine variants") + theme(axis.text.x = element_blank(), legend.position='top') + geom_hline(yintercept=1, color="black", size=.1)
grid.newpage()
grid.draw(rbind(ggplotGrob(pten_g_pos), ggplotGrob(pten_dssp_schematic1), size = "last"))

pten_h_pos <- ggplot(data=subset(pten1_proc_wt, end=="H"), aes(x=position, y=score, colour=start))+ geom_point(data=subset(pten1_proc_wt, end=="H" & start %in% aas2), size=.6) + scale_x_continuous(breaks=seq(0, 403, 20), minor_breaks = seq(0, 403, 5), limits = c(0, 403), expand = c(0,0)) + scale_y_continuous(expand = c(0,0), limits = c(-0.25, 1.5)) + scale_color_manual(values=twenty_color1) +ylab("Abundance score")+labs(colour="Reference amino acid")+xlab(NULL)+ggtitle("Abundance scores of Histidine variants") + theme(axis.text.x = element_blank(), legend.position='top') + geom_hline(yintercept=1, color="black", size=.1)
grid.newpage()
grid.draw(rbind(ggplotGrob(pten_h_pos), ggplotGrob(pten_dssp_schematic1), size = "last"))

#2nd from last grey region
pten_w_pos <- ggplot(data=subset(pten1_proc_wt, end=="W"), aes(x=position, y=score, colour=start))+ geom_point(data=subset(pten1_proc_wt, end=="W" & start %in% aas2), size=.6) + scale_x_continuous(breaks=seq(0, 403, 20), minor_breaks = seq(0, 403, 5), limits = c(0, 403), expand = c(0,0)) + scale_y_continuous(expand = c(0,0), limits = c(-0.25, 1.5)) + scale_color_manual(values=twenty_color1) +ylab("Abundance score")+labs(colour="Reference amino acid")+xlab(NULL)+ggtitle("Abundance scores of Typtophan variants") + theme(axis.text.x = element_blank(), legend.position='top') + geom_hline(yintercept=1, color="black", size=.1)
grid.newpage()
grid.draw(rbind(ggplotGrob(pten_w_pos), ggplotGrob(pten_dssp_schematic1), size = "last"))

LS0tCnRpdGxlOiAiUFRFTiBSIE5vdGVib29rIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCmBgYHtyIGdsb2JhbF9vcHRpb25zLCBpbmNsdWRlPUZBTFNFfQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGdncGxvdDIpCnJlcXVpcmUoZ3JpZEV4dHJhKQpsaWJyYXJ5KHJlc2hhcGUyKQpsaWJyYXJ5KHByYWNtYSkKbGlicmFyeShnZ2JlZXN3YXJtKQpsaWJyYXJ5KFJtaXNjKQpsaWJyYXJ5KGdyaWQpCmxpYnJhcnkoRUJJbWFnZSkKbGlicmFyeShnb29nbGVzaGVldHMpCmxpYnJhcnkodGlkeXIpCmxpYnJhcnkoZHBseXIpCmtuaXRyOjpvcHRzX2NodW5rJHNldChmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9MTIsIHdhcm5pbmc9RkFMU0UpCmBgYApNdWx0aXBsZXggYXNzZXNzbWVudCBvZiBwcm90ZWluIHZhcmlhbnQgYWJ1bmRhbmNlIGJ5IG1hc3NpdmVseSBwYXJhbGxlbCBzZXF1ZW5jaW5nClZBTVAtc2VxCi0gbXVsdGlwbGV4IGFzc2F5IHRoYXQgdXNlcyBmbHVvcmVzY2VudCByZXBvcnRlcnMgdG8gbWVhc3VyZSB0aGUgc3RlYWR5LXN0YXRlIGFidW5kYW5jZSBvZiBwcm90ZWluIHZhcmlhbnRzIGluIGN1bHR1cmVkIGh1bWFuIGNlbGxzIChlYWNoIGNlbGxleHByZXNzZXMgYSBzaW5nbGUgdmFyaWFudCBkaXJlY3RseSBmdXNlZCB0byBFR0ZQLi4udGhlIHN0YWJpbGl0eSBvZiB0aGUgdmFyaWFudCBkaWN0YXRlcyB0aGUgYWJ1bmRhbmNlIG9mIHRoZSBFR0ZQIGZ1c2lvbiBhbmQsIGFjY29yZGluZ2x5LCB0aGUgZ3JlZW4gZmx1b3Jlc2NlbmNlIHNpZ25hbCBvZiB0aGUgY2VsbCkKLSB1c2VkIHRvIGFzc2VzcyBQVEVOIGFuZCBUUE1UIHZhcmlhbnRzIApgYGB7ciBlY2hvPUZBTFNFfQpwYXIocGNoPTIwLCBjZXg9LjYpCiNsb2NhbApwdGVuMV9kYXRhIDwtIHJlYWQuZGVsaW0oJ34vbGVrbGFiL2xla2xhYi9wdGVuMS50eHQnKQpwdGVuMV9wcm9jIDwtIHB0ZW4xX2RhdGFbIWlzLm5hKHB0ZW4xX2RhdGEkYWJ1bmRhbmNlX2NsYXNzKSxdCmRkIDwtIGRhdGEuZnJhbWUocHRlbjFfcHJvYyRhYnVuZGFuY2VfY2xhc3MscHRlbjFfcHJvYyRzY29yZSkKY29sbmFtZXMoZGQpIDwtIGMoImFidW5kYW5jZV9jbGFzcyIsICJzY29yZSIpCiNsb2NhbAp0cG10MV9kYXRhIDwtIHJlYWQuZGVsaW0oJ34vbGVrbGFiL2xla2xhYi90cG10X3N1cHBsXzIudHh0JykKdHBtdDFfcHJvYyA8LSB0cG10MV9kYXRhWyFpcy5uYSh0cG10MV9kYXRhJGFidW5kYW5jZV9jbGFzcyksXQplZSA8LSBkYXRhLmZyYW1lKHRwbXQxX3Byb2MkYWJ1bmRhbmNlX2NsYXNzLHRwbXQxX3Byb2Mkc2NvcmUpCmNvbG5hbWVzKGVlKSA8LSBjKCJhYnVuZGFuY2VfY2xhc3MiLCAic2NvcmUiKQpkZCRwcm90ZWluIDwtIHJlcCgiUFRFTiIsIG5yb3coZGQpKQplZSRwcm90ZWluIDwtIHJlcCgiVFBNVCIsIG5yb3coZWUpKQpmZiA9IGRhdGEuZnJhbWUocmJpbmQoZGQsIGVlKSkKYmJwcCA9IGJveHBsb3Qoc2NvcmV+cHJvdGVpbithYnVuZGFuY2VfY2xhc3MsIGRhdGEgPSBmZiwgYXQgPSBjKDEsIDEuOCwgMywgMy44LCA1LCA1LjgsIDcuMiwgOCksIHhheHQ9J24nLCBjb2wgPSBjKCd3aGl0ZScsICdncmF5JykpCmF4aXMoc2lkZT0xLCBhdD1jKDEuNCwgMy40LCA1LjQsIDcuNiksIGxhYmVscz1jKCdsb3cnLCAncG9zc2libHkgbG93JywgJ3Bvc3NpYmx5XG4gd3QtbGlrZScsICd3dC1saWtlJykpCnRpdGxlKCdWQU1QLXNlcSBzY29yZXMgb2YgUFRFTiBhbmQgVFBNVCBWYXJpYW50c1xuYW5kIGFidW5kYW5jZSBjbGFzcycpCgpgYGAKCmBgYHtyIGVjaG89RkFMU0V9CiNwbG90cyBWQU1QLXNlcSBzY29yZSB2cyBhYnVuZGFuY2VfY2xhc3MKClZBTVBfYWJ1bmRhbmNlIDwtIGdncGxvdChmZiwgYWVzKHg9YWJ1bmRhbmNlX2NsYXNzLCB5PXNjb3JlLCBmaWxsPXByb3RlaW4pKSArIGdlb21fdmlvbGluKGRyYXdfcXVhbnRpbGVzID0gMC41KSt5bGFiKCJWQU1QLXNlcSBzY29yZSIpK3hsYWIoIkFidW5kYW5jZSBDbGFzcyIpK3RoZW1lKGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCksIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImdyZXkiKSwgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiZ3JleSIpKStnZ3RpdGxlKCJWQU1QLXNlcSBzY29yZXMgZm9yIGVhY2ggYWJ1bmRhbmNlIGNsYXNzaWZpY2F0aW9uIikrZ2VvbV9wb2ludChkYXRhPWRhdGEuZnJhbWUoeD0id3QtbGlrZSIsIHk9MSwgcHJvdGVpbiA9ICJQVEVOIiksIGFlcyh4LHkpLCBjb2xvdXI9ImJsYWNrIiwgc2l6ZT0xLjUsIHNob3cubGVnZW5kPUZBTFNFKSthbm5vdGF0ZSgidGV4dCIsIHggPSAid3QtbGlrZSIsIHk9MS4wOSwgbGFiZWwgPSAiV1QiLGNvbG91cj0gImJsYWNrIiwgc2l6ZSA9IDQpICsgc2NhbGVfeV9jb250aW51b3VzKG1pbm9yX2JyZWFrcyA9IHNlcSgtMiwgMiwgLjI1KSkrdGhlbWVfYncoKQpwbG90KFZBTVBfYWJ1bmRhbmNlKQpgYGAKCmBgYHtyIGVjaG89RkFMU0V9CiNjb21iaW5pbmcgcHRlbjFfZGF0YSBhbmQgdHBtdDFfZGF0YSBpbnRvIG9uZSBsYXJnZSBkYXRhIGZyYW1lLCBkaWZmZXJlbnRpYXRlIGJldHdlZW4gdGhlIHR3byB3LyBjb2x1bW4gJ3Byb3RlaW4nIHdoaWNoIHNwZWNpZmllcyAnUFRFTicgb3IgJ1RQTVQnCnB0ZW4xX2RhdGEkcHJvdGVpbiA8LSByZXAoIlBURU4iLCBucm93KHB0ZW4xX2RhdGEpKQp0cG10MV9kYXRhJHByb3RlaW4gPC0gcmVwKCJUUE1UIiwgbnJvdyh0cG10MV9kYXRhKSkKY29tbW9uX2NvbHMgPC0gaW50ZXJzZWN0KGNvbG5hbWVzKHB0ZW4xX2RhdGEpLCBjb2xuYW1lcyh0cG10MV9kYXRhKSkKY29tYl9kYXRhID0gcmJpbmQoc3Vic2V0KHB0ZW4xX2RhdGEsIHNlbGVjdCA9IGNvbW1vbl9jb2xzKSwgc3Vic2V0KHRwbXQxX2RhdGEsIHNlbGVjdCA9IGNvbW1vbl9jb2xzKSkKCiNwbG90cyBoZWxpeCB2cyBzY29yZSBmb3IgUFRFTiBhbmQgVFBNVCBzaWRlIGJ5IHNpZGUKI25vIE5BCgpjb21iX2RhdGFfaGVsaXggPC0gY29tYl9kYXRhWyFpcy5uYShjb21iX2RhdGEkaGVsaXgpLF0KI2NoZWNrIHRvIHNlZSB3aGVyZSAzNzU5IHJvd3Mgd2VudCBvZmYgdG8KY2sgPC0gY29tYl9kYXRhX2hlbGl4WyFpcy5uYShjb21iX2RhdGFfaGVsaXgkYWJ1bmRhbmNlX2NsYXNzKSxdCmNvbWJfZGF0YV9zaGVldCA8LSBjb21iX2RhdGFbIWlzLm5hKGNvbWJfZGF0YSRzaGVldCksXQpjazEgPC0gY29tYl9kYXRhX3NoZWV0WyFpcy5uYShjb21iX2RhdGFfc2hlZXQkYWJ1bmRhbmNlX2NsYXNzKSxdCgpoX3Bsb3QgPC0gZ2dwbG90KGNrLCBhZXMoeD1hcy5mYWN0b3IoaGVsaXgpLCB5PXNjb3JlLCBmaWxsPXByb3RlaW4pKSArIGdlb21fdmlvbGluKGRhdGE9c3Vic2V0KGNrLCBoZWxpeD09MSksIGRyYXdfcXVhbnRpbGVzID0gYygwLjUpKSArIGd1aWRlcyhmaWxsPUZBTFNFKSArIHhsYWIoIkFscGhhIEhlbGl4IikgKyB5bGFiKCJWQU1QLXNlcSBzY29yZSIpICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCkpICsgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLS43LCAyLjAzKSkKCnNfcGxvdCA8LSBnZ3Bsb3QoY2sxLCBhZXMoeD1hcy5mYWN0b3Ioc2hlZXQpLCB5PXNjb3JlLCBmaWxsPXByb3RlaW4pKSArIGdlb21fdmlvbGluKGRhdGE9c3Vic2V0KGNrMSwgc2hlZXQ9PTEpLCBkcmF3X3F1YW50aWxlcyA9IGMoMC41KSkgKyAgdGhlbWUoYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLCBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwgYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCkpICsgeGxhYigiQmV0YSBTaGVldCIpICsgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLS43LCAyLjAzKSkgKyBndWlkZXMoZmlsbD1GQUxTRSkgCgpuX3Bsb3QgPC0gZ2dwbG90KGNrLCBhZXMoeD1hcy5mYWN0b3IoaGVsaXgpLCB5PXNjb3JlLCBmaWxsPXByb3RlaW4pKSArIGdlb21fdmlvbGluKGRhdGE9c3Vic2V0KGNrLCBoZWxpeD09MCAmIHNoZWV0PT0wKSwgZHJhd19xdWFudGlsZXMgPSBjKCAwLjUpKSArIHRoZW1lKCBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLCBheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwgbGVnZW5kLmp1c3RpZmljYXRpb249YygxLDApLCBsZWdlbmQucG9zaXRpb249YyguNDksLjc1KSwgbGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSwgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xMCkpICsgeGxhYigiT3RoZXIiKSArIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKC0uNywgMi4wMykpCgojcHV0IHRoZSBwbG90cyBzaWRlIGJ5IHNpZGUKY29tYmluZWQgPC0gZ3JpZC5hcnJhbmdlKGhfcGxvdCwgc19wbG90LCBuX3Bsb3QsIG5jb2w9MywgdG9wID0gIlZhcmlhbnQgc2NvcmVzIGluIHJlbGF0aW9uIHRvIHBvc2l0aW9uIGluIHByb3RlaW4iKQojIyMjIyMjIyMjIyMjIwojI3NhdmUgYXMgcGRmCgojIHBkZigidmlvbGluX1ZhcmlhbnRfc2NvcmVzX3ZzLnBkZiIpCiMgcGxvdChjb21iaW5lZCkKIyBwbG90KFZBTVBfYWJ1bmRhbmNlKQojIGRldi5vZmYoKQojIyMjIyMjIyMjIyMjIwojd29ya3MgdG8gc2F2ZSBzaW5nbGUKI2dnc2F2ZSgiVmFyaWFudF9zY29yZXNfcHJvdGVpbl9wb3NpdGlvbi5wZGYiLCBwbG90ID0gY29tYmluZWQsIGRldmljZSA9ICJwZGYiLCBwYXRoID0gIi9Vc2Vycy9nbzJhbHlzc2EvRGVza3RvcC8iLCBzY2FsZSA9IDIuNiwgZHBpID0gInJldGluYSIpCgpgYGAKCmBgYHtyIGVjaG89RkFMU0V9CiMgZ3JhcGggVkFNUC1zZXEgc2NvcmVzIHJlbGF0aXZlIHRvIHZhcmlhbnQgcG9zaXRpb24gaW4gcHJvdGVpbgojcHRlbgpwdGVuMV9wcm9jX3d0IDwtIHB0ZW4xX3Byb2NbIWlzLm5hKHB0ZW4xX3Byb2MkcG9zaXRpb24pLF0KcHRlbjFfcHJvY193dCRzZWNvbmRhcnlfc3RydWN0IDwtIGlmZWxzZShpcy5uYShwdGVuMV9wcm9jX3d0JGhlbGl4KSwgInVua25vd24iLAogICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UocHRlbjFfcHJvY193dCRoZWxpeD09MSwgImhlbGl4IiwKICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHB0ZW4xX3Byb2Nfd3Qkc2hlZXQ9PTEsICJzaGVldCIsCiAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShwdGVuMV9wcm9jX3d0JGhlbGl4PT0wLCAibmVpdGhlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ1bmtub3duIikpKSkKcHRlbl9wb3MgPC0gZ2dwbG90KHB0ZW4xX3Byb2Nfd3QsIGFlcyh4PXBvc2l0aW9uLCB5PXNjb3JlLCBjb2xvdXI9c2Vjb25kYXJ5X3N0cnVjdCkpKyBnZW9tX3BvaW50KHNpemU9LjMpICsgc2NhbGVfeF9jb250aW51b3VzKG1pbm9yX2JyZWFrcyA9IHNlcSgwLCA0MjAsIDUpKSArIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiI0ZGNDg0OCIsICIjMDBDODUzIiwgIiM1NzU3RkYiLCAiI0E5QTlBOSIpKSAreWxhYigiVkFNUC1zZXEgc2NvcmUiKSt4bGFiKCJQb3NpdGlvbiBpbiBQVEVOIikrbGFicyhjb2xvdXI9IlNlY29uZGFyeSBTdHJ1Y3R1cmUiKStnZ3RpdGxlKCJQVEVOIHNjb3JlcyBpbiByZWxhdGlvbiB0byBwcm90ZWluIHN0cnVjdHVyZSIpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTI3LCBjb2xvcj0iYmxhY2siLCBzaXplPS4xKSArIGdlb21fdmxpbmUoeGludGVyY2VwdD01NSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0uMSkgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9NzAsIGNvbG9yPSJibGFjayIsIHNpemU9LjEpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTg1LCBjb2xvcj0iYmxhY2siLCBzaXplPS4xKSArIGdlb21fdmxpbmUoeGludGVyY2VwdD0xNjQuNSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0uMSkgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MjEyLCBjb2xvcj0iYmxhY2siLCBzaXplPS4xKSArIGdlb21fdmxpbmUoeGludGVyY2VwdD0yNjcuNSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0uMSkgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MzQzLjUsIGNvbG9yPSJibGFjayIsIHNpemU9LjEpK3RoZW1lX2J3KCkKCnB0ZW5faHlkcm8gPC0gZ2dwbG90KHB0ZW4xX3Byb2Nfd3QsIGFlcyh4PXBvc2l0aW9uLCB5PXNjb3JlLCBjb2xvdXI9KGh5ZHJvMi1oeWRybzEpKSkrIGdlb21fcG9pbnQoc2l6ZT0uMywgYWxwaGEgPSAwLjMpICsgc2NhbGVfeF9jb250aW51b3VzKG1pbm9yX2JyZWFrcyA9IHNlcSgwLCA0MjAsIDUpKSArIHlsYWIoIlZBTVAtc2VxIHNjb3JlIikreGxhYigiUG9zaXRpb24gaW4gUFRFTiIpK2xhYnMoY29sb3VyPSJIeWRyb3Bob2JpY2l0eSIpK2dndGl0bGUoIlBURU4gc2NvcmVzIGluIHJlbGF0aW9uIHRvIGNoYW5nZSBpbiBoeWRyb3Bob2JpY2l0eSIpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTI3LCBjb2xvcj0iYmxhY2siLCBzaXplPS4xKSArIGdlb21fdmxpbmUoeGludGVyY2VwdD01NSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0uMSkgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9NzAsIGNvbG9yPSJibGFjayIsIHNpemU9LjEpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTg1LCBjb2xvcj0iYmxhY2siLCBzaXplPS4xKSArIGdlb21fdmxpbmUoeGludGVyY2VwdD0xNjQuNSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0uMSkgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MjEyLCBjb2xvcj0iYmxhY2siLCBzaXplPS4xKSArIGdlb21fdmxpbmUoeGludGVyY2VwdD0yNjcuNSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0uMSkgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MzQzLjUsIGNvbG9yPSJibGFjayIsIHNpemU9LjEpCgoKI3RwbXQKdHBtdDFfcHJvY193dCA8LSB0cG10MV9wcm9jWyFpcy5uYSh0cG10MV9wcm9jJHBvc2l0aW9uKSxdCnRwbXQxX3Byb2Nfd3Qkc2Vjb25kYXJ5X3N0cnVjdCA8LSBpZmVsc2UoaXMubmEodHBtdDFfcHJvY193dCRoZWxpeCksICJ1bmtub3duIiwKICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHRwbXQxX3Byb2Nfd3QkaGVsaXg9PTEsICJoZWxpeCIsCiAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh0cG10MV9wcm9jX3d0JHNoZWV0PT0xLCAic2hlZXQiLAogICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UodHBtdDFfcHJvY193dCRoZWxpeD09MCwgIm5laXRoZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAidW5rbm93biIpKSkpCnRwbXRfcG9zIDwtIGdncGxvdCh0cG10MV9wcm9jX3d0LCBhZXMoeD1wb3NpdGlvbiwgeT1zY29yZSwgY29sb3VyPXNlY29uZGFyeV9zdHJ1Y3QpKSsgZ2VvbV9wb2ludChzaXplPS4zKSArIHNjYWxlX3hfY29udGludW91cyhtaW5vcl9icmVha3MgPSBzZXEoMCwgNDA1LCA1KSkgKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoIiNGRjQ4NDgiLCAiIzAwQzg1MyIsICIjNTc1N0ZGIiwgIiNBOUE5QTkiKSkgK3lsYWIoIlZBTVAtc2VxIHNjb3JlIikreGxhYigiUG9zaXRpb24gaW4gVFBNVCIpK2xhYnMoY29sb3VyPSJTZWNvbmRhcnkgU3RydWN0dXJlIikrZ2d0aXRsZSgiVFBNVCBzY29yZXMgaW4gcmVsYXRpb24gdG8gcHJvdGVpbiBzdHJ1Y3R1cmUiKSArIGdlb21fdmxpbmUoeGludGVyY2VwdD00NywgY29sb3I9ImJsYWNrIiwgc2l6ZT0uMSkgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9NzgsIGNvbG9yPSJibGFjayIsIHNpemU9LjEpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTEyMi41LCBjb2xvcj0iYmxhY2siLCBzaXplPS4xKSArIGdlb21fdmxpbmUoeGludGVyY2VwdD0xNDAsIGNvbG9yPSJibGFjayIsIHNpemU9LjEpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTE2NSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0uMSkgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MTk0LCBjb2xvcj0iYmxhY2siLCBzaXplPS4xKSArIGdlb21fdmxpbmUoeGludGVyY2VwdD0yMDksIGNvbG9yPSJibGFjayIsIHNpemU9LjEpK3RoZW1lX2J3KCkKCnRwbXRfY29sb3JzIDwtIHRwbXQxX3Byb2Nfd3QKI1tvcmRlcihwb3NpdGlvbiwgdmFyaWFudCksXQp0cG10X2NvbG9ycyRmYWN0IDwtIHJlcCgxMCwgbnJvdyh0cG10X2NvbG9ycykpCnRlbXAgPC0gMQpmb3IoaSBpbiAxOihsZW5ndGgodHBtdF9jb2xvcnMkZmFjdCktMSkpIHsKICBpZiAodHBtdF9jb2xvcnMkc2Vjb25kYXJ5X3N0cnVjdFtpXSAhPSB0cG10X2NvbG9ycyRzZWNvbmRhcnlfc3RydWN0W2krMV0pIHsKICAgIHRwbXRfY29sb3JzJGZhY3RbaV0gPC0gdGVtcAogICAgdGVtcCA8LSB0ZW1wICsgMQogIH0gZWxzZSB7CiAgdHBtdF9jb2xvcnMkZmFjdFtpXSA8LSB0ZW1wCiAgfQp9CnRwbXRfY29sb3JzJGZhY3RbbGVuZ3RoKHRwbXRfY29sb3JzJGZhY3QpXSA8LSB0ZW1wCgojIGNjIDwtIDAKIyBmb3IoaSBpbiAxOihsZW5ndGgodHBtdF9jb2xvcnMkZmFjdCktMSkpIHsKIyAgIGlmICh0cG10X2NvbG9ycyRmYWN0W2ldICE9IHRwbXRfY29sb3JzJGZhY3RbaSsxXSkgewojICAgICBwcmludChjYykKIyAgICAgY2MgPC0gMAojICAgfSBlbHNlIHsKIyAgICAgY2MgPC0gY2MgKyAxCiMgICB9CiMgfQoKdHBtdF9wb3NfdnAgPC0gZ2dwbG90KHRwbXRfY29sb3JzLCBhZXMoeD1wb3NpdGlvbiwgeT1zY29yZSkpKyBnZW9tX3Zpb2xpbihkYXRhPXRwbXRfY29sb3JzW2MoMToyNzgzLCAyNzk4OjQwMDApLF0sIGFlcyhmaWxsPWFzLmNoYXJhY3RlcihmYWN0KSwgY29sb3VyID0gZmFjdG9yKFRSVUUpKSwgZHJhd19xdWFudGlsZXMgPSBjKDAuNSksIHNjYWxlID0gIndpZHRoIikgKyAKc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIjEiID0gIiNBOUE5QTkiLCAiMiIgPSAiIzAwQzg1MyIsICIzIiA9ICIjRkY0ODQ4IiwgIjQiID0gIiMwMEM4NTMiLCI1IiA9ICIjRkY0ODQ4IiwgIjYiID0gIiMwMEM4NTMiLCI3IiA9ICIjNTc1N0ZGIiwgIjgiID0gIiMwMEM4NTMiLCI5IiA9ICIjRkY0ODQ4IiwiMTAiID0gIiMwMEM4NTMiLCIxMSIgPSAiIzU3NTdGRiIsICIxMiIgPSAiIzAwQzg1MyIsIjEzIiA9ICIjRkY0ODQ4IiwgIjE0IiA9ICIjMDBDODUzIiwgIjE1IiA9ICIjNTc1N0ZGIiwgIjE2IiA9ICIjMDBDODUzIiwgIjE3IiA9ICIjNTc1N0ZGIiwgIjE4IiA9ICIjMDBDODUzIiwgIjE5IiA9ICIjNTc1N0ZGIiwgIjIwIiA9ICIjMDBDODUzIiwgIjIxIiA9ICIjNTc1N0ZGIiwgIjIyIiA9ICIjMDBDODUzIiwgIjIzIiA9ICIjRkY0ODQ4IiwgIjI0IiA9ICIjNTc1N0ZGIiwgIjI1IiA9ICIjMDBDODUzIiwgIjI2IiA9ICIjRkY0ODQ4IiwgIjI3IiA9ICIjMDBDODUzIiwgIjI4IiA9ICIjNTc1N0ZGIiwgIjI5IiA9ICIjMDBDODUzIiwgIjMwIiA9ICIjNTc1N0ZGIiwgIjMxIiA9ICIjMDBDODUzIikpICsgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJibGFjayIpKSArIHNjYWxlX3hfY29udGludW91cyhtaW5vcl9icmVha3MgPSBzZXEoMCwgNDA1LCA1KSkgKyB5bGFiKCJWQU1QLXNlcSBzY29yZSIpK3hsYWIoIlBvc2l0aW9uIGluIFRQTVQiKStsYWJzKGNvbG91cj0iU2Vjb25kYXJ5IFN0cnVjdHVyZSIpK2dndGl0bGUoIlRQTVQgc2NvcmVzIGluIHJlbGF0aW9uIHRvIHByb3RlaW4gc3RydWN0dXJlIikgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9NDcsIGNvbG9yPSJibGFjayIsIHNpemU9LjEpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTc4LCBjb2xvcj0iYmxhY2siLCBzaXplPS4xKSArIGdlb21fdmxpbmUoeGludGVyY2VwdD0xMjIuNSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0uMSkgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MTQwLCBjb2xvcj0iYmxhY2siLCBzaXplPS4xKSArIGdlb21fdmxpbmUoeGludGVyY2VwdD0xNjUsIGNvbG9yPSJibGFjayIsIHNpemU9LjEpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTE5NCwgY29sb3I9ImJsYWNrIiwgc2l6ZT0uMSkgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MjA5LCBjb2xvcj0iYmxhY2siLCBzaXplPS4xKQoKCnB0ZW5faHlkcm8xIDwtIGdncGxvdChwdGVuMV9wcm9jX3d0LCBhZXMoeT1zY29yZSwgeD0oaHlkcm8yLWh5ZHJvMSkpKSsgZ2VvbV9wb2ludChzaXplPTAuNSwgYWxwaGEgPSAwLjMpICsgeWxhYigiSHlkcm9waG9iaWNpdHkiKSt4bGFiKCJWQU1QLXNlcSBzY29yZSIpK2dndGl0bGUoIlBURU4gc2NvcmVzIGluIHJlbGF0aW9uIHRvIGNoYW5nZSBpbiBoeWRyb3Bob2JpY2l0eSIpCgpwdGVuX2FhX3NwcmVhZCA8LSBnZ3Bsb3QocHRlbjFfcHJvY193dFsyOjI4OCxdLCBhZXMoeT1zY29yZSwgeD1zdGFydCkpICsgZ2VvbV92aW9saW4oZHJhd19xdWFudGlsZXM9YygwLjUpKQpwdGVuX2FhX3NwcmVhZDEgPC0gZ2dwbG90KHB0ZW4xX3Byb2Nfd3RbMjoyODgsXSwgYWVzKHk9c2NvcmUsIHg9c3RhcnQpKSArIGdlb21fcG9pbnQoc2l6ZSA9IDAuNSkKCgpwbG90KHB0ZW5fcG9zKQpwbG90KHRwbXRfcG9zKQoKI3Bsb3QodHBtdF9wb3NfdnApCiNwbG90KHB0ZW5faHlkcm8pCiNwbG90KHB0ZW5faHlkcm8xKQojcGxvdChwdGVuX2FhX3NwcmVhZCkKI3Bsb3QocHRlbl9hYV9zcHJlYWQxKQpgYGAKYGBge3J9CiMgZ3JhcGggVkFNUC1zZXEgc2NvcmVzIHJlbGF0aXZlIHRvIHZhcmlhbnQgcG9zaXRpb24gaW4gcHJvdGVpbgojcHRlbgpwdGVuMV9oYm9uZCA8LSBwdGVuMV9wcm9jWyFpcy5uYShwdGVuMV9wcm9jJGhib25kX3N1bSksXQpwdGVuMV9oYm9uZCRzZWNvbmRhcnlfc3RydWN0IDwtIGlmZWxzZShpcy5uYShwdGVuMV9oYm9uZCRoZWxpeCksICJ1bmtub3duIiwKICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHB0ZW4xX2hib25kJGhlbGl4PT0xLCAiaGVsaXgiLAogICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UocHRlbjFfaGJvbmQkc2hlZXQ9PTEsICJzaGVldCIsCiAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShwdGVuMV9oYm9uZCRoZWxpeD09MCwgIm5laXRoZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAidW5rbm93biIpKSkpCnB0ZW5fcGxvdF9oYm9uZCA8LSBnZ3Bsb3QocHRlbjFfaGJvbmQsIGFlcyh4PWhib25kX3N1bSwgeT1zY29yZSwgY29sb3VyPXNlY29uZGFyeV9zdHJ1Y3QpKSsgZ2VvbV9wb2ludChhbHBoYT0wLjQpICsgeWxhYigiVkFNUC1zZXEgc2NvcmUiKSt4bGFiKCJEU1NQIFN1bSBvZiBoeWRyb2dlbiBib25kcyIpK2dndGl0bGUoIlBURU4gc2NvcmVzIGluIHJlbGF0aW9uIHRvIGh5ZHJvZ2VuIGJvbmRpbmciKSArIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiI0ZGNDg0OCIsICIjNjk2OTY5IiwgIiM1NzU3RkYiKSkgKyBsYWJzKGNvbG91cj0iU2Vjb25kYXJ5IFN0cnVjdHVyZSIpICsgdGhlbWVfYncoKQpwbG90KHB0ZW5fcGxvdF9oYm9uZCkKCnB0ZW5fcGxvdF9oYm9uZDEgPC0gZ2dwbG90KHB0ZW4xX2hib25kLCBhZXMoeD1oYm9uZF9zdW0sIHk9c2NvcmUpKSsgZ2VvbV9wb2ludChhbHBoYSA9IDAuMikgKyB5bGFiKCJWQU1QLXNlcSBzY29yZSIpK3hsYWIoIkRTU1AgU3VtIG9mIGh5ZHJvZ2VuIGJvbmRzIikrZ2d0aXRsZSgiUFRFTiBzY29yZXMgaW4gcmVsYXRpb24gdG8gaHlkcm9nZW4gYm9uZGluZyIpICsgdGhlbWVfYncoKQoKIyB3YXMgaW4gYWVzLCBnZ3Bsb3QgZnVuY3Rpb24gY2FsbCAtLS0+IGNvbG91cj1zZWNvbmRhcnlfc3RydWN0CiNzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoIiNGRjQ4NDgiLCAiIzAwQzg1MyIsICIjNTc1N0ZGIiwgIiNBOUE5QTkiKSkgKyBsYWJzKGNvbG91cj0iU2Vjb25kYXJ5IFN0cnVjdHVyZSIpKwoKcGxvdChwdGVuX3Bsb3RfaGJvbmQxKQojbGVzcyBoeWRyb2dlbiBib25kcyB+IGhpZ2hlciBhYnVuZGFuY2UKYGBgCmBgYHtyIGluY2x1ZGU9RkFMU0V9CiNUUE1UCnRwbXRfc3VtIDwtIHN1bW1hcnlTRSh0cG10MV9wcm9jX3d0LCBtZWFzdXJldmFyPSJzY29yZSIsIGdyb3VwdmFycz0icG9zaXRpb24iKQojaGVhZCh0cG10X3N1bSkKdHBtdF9wb3NfbWVhbiA8LSBnZ3Bsb3QodHBtdF9zdW0sIGFlcyh4PXBvc2l0aW9uLCB5PXNjb3JlKSkrIGdlb21fYmFyKHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKCksIHN0YXQ9ImlkZW50aXR5IiwgY29sb3VyPSIjOTk5OTk5IikgKyBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPXNjb3JlLXNkLCB5bWF4ID0gc2NvcmUrc2QpLCB3aWR0aD0xLCBzaXplPTAuMywgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoKSkgK3lsYWIoIlZBTVAtc2VxIHNjb3JlIikrdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLCBheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSkgKyBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDI0NSwgMTApLCBleHBhbmQgPSBjKDAsMCkpICsgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSkKI2ZhY3Rvcihwb3NpdGlvbikgaXMgZ2V0dGluZyByaWQgb2Ygc29tZSBwb3NpdGlvbnMgYWx0b2dldGhlciBvbiB0aGUgZ3JhcGgKI3RwbXRfcG9zX21lYW4gPC0gZ2dwbG90KHRwbXRfc3VtLCBhZXMoeD1mYWN0b3IocG9zaXRpb24pLCB5PXNjb3JlKSkrIGdlb21fYmFyKHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKCksIHN0YXQ9ImlkZW50aXR5IiwgY29sb3VyPSIjOTk5OTk5IikgKyBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPXNjb3JlLXNkLCB5bWF4ID0gc2NvcmUrc2QpLCB3aWR0aD0wLjAwMSwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoKSkgK3lsYWIoIlZBTVAtc2VxIHNjb3JlIikrdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLCBheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSkgKyBzY2FsZV94X2Rpc2NyZXRlKGJyZWFrcyA9IHNlcSgwLCAyNTAsIDEwKSkKdHBtdF9oZWF0IDwtIGdncGxvdCh0cG10MV9wcm9jX3d0LCBhZXMocG9zaXRpb24sIGVuZCkpICsgZ2VvbV90aWxlKGFlcyhmaWxsPXNjb3JlKSkgKyBzY2FsZV9maWxsX2dyYWRpZW50bihjb2xvdXJzID0gYygiIzNGN0NCOSIsICIjRkZFQUYzIiwgIiNCMjFGNEUiKSwgdmFsdWVzID0gc2NhbGVzOjpyZXNjYWxlKGMoLTAuNywgMC4yLCAxLCAxLjMsIDIuMDMpKSkrIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMjQ1LCAxMCksIGV4cGFuZD1jKDAsMCkpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSdib3R0b20nKSt4bGFiKCJQb3NpdGlvbiBpbiBUUE1UIikgKyBzY2FsZV95X2Rpc2NyZXRlKGV4cGFuZCA9IGMoMCwwKSkKI3NjYWxlX2ZpbGxfZ3JhZGllbnQyKGxvdz0iIzNGN0NCOSIsIG1pZD0id2hpdGUiLCBoaWdoPSIjQjIxRjRFIiwgbWlkcG9pbnQ9MSkgCiNzY2FsZV9maWxsX2Rpc3RpbGxlcihwYWxldHRlPSAiUmRCdSIpCnRwbXRfZHNzcF9zY2hlbWF0aWMgPC0gZ2dwbG90KCkgKyBnZ3RpdGxlKCJUUE1UIG1lYW4gYWJ1bmRhbmNlIHNjb3JlcyIpICsKICBnZW9tX3NlZ21lbnQoYWVzKHggPSAxLCB5ID0gMCwgeGVuZCA9IG1heCh0cG10MV9kYXRhJHBvc2l0aW9uKSksIHllbmQgPSAwLCBzaXplID0gMSwgY29sb3IgPSAiZ3JleTcwIikgKwogIGdlb21fcG9pbnQoZGF0YSA9IHRwbXQxX2RhdGEsIGFlcyh4ID0gcG9zaXRpb24sIHkgPSAwKSwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMS44KSArCiAgZ2VvbV9wb2ludChkYXRhID0gc3Vic2V0KHRwbXQxX2RhdGEsIHNoZWV0ID09IDEpLCBhZXMoeCA9IHBvc2l0aW9uLCB5ID0gMCksIGNvbG9yID0gInBpbmsiLCBzaXplID0gMS41KSArCiAgZ2VvbV9wb2ludChkYXRhID0gc3Vic2V0KHRwbXQxX2RhdGEsIGhlbGl4ID09IDEpLCBhZXMoeCA9IHBvc2l0aW9uLCB5ID0gMCksIGNvbG9yID0gImN5YW4iLCBzaXplID0gMS41KSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAyNDUsIDEwKSwgZXhwYW5kID0gYygwLDApKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IE5VTEwsIGV4cGFuZCA9IGMoMCwwKSkgK3hsYWIoTlVMTCkgKyB5bGFiKE5VTEwpICsKICB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X2JsYW5rKCksIGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLCBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSkKCiNwbG90cwpwbG90KHRwbXRfcG9zX21lYW4pCnBsb3QodHBtdF9oZWF0KQp0cG10X2Rzc3Bfc2NoZW1hdGljCgojKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MTg1LCBjb2xvcj0iYmxhY2siLCBzaXplPS4xKSArIGdlb21fdmxpbmUoeGludGVyY2VwdD0zNTAsIGNvbG9yPSJibGFjayIsIHNpemU9LjEpCgojZ3JvdXBpbmcgYWxsIHZhcmlhbnRzIGluIHRoZSBzYW1lIHNlY29uZGFyeSBzdHJ1Y3R1cmUgdG9nZXRoZXIKdHBtdF9hYV9zdW0gPC0gc3VtbWFyeVNFKHRwbXRfY29sb3JzLCBtZWFzdXJldmFyPSJzY29yZSIsIGdyb3VwdmFycz0iZmFjdCIpCnRwbXRfYWFfbWVhbiA8LSBnZ3Bsb3QodHBtdF9hYV9zdW0sIGFlcyh4PWZhY3QsIHk9c2NvcmUpKSsgZ2VvbV9iYXIocG9zaXRpb249cG9zaXRpb25fZG9kZ2UoKSwgc3RhdD0iaWRlbnRpdHkiLCBjb2xvdXI9IiM5OTk5OTkiKSArIGdlb21fZXJyb3JiYXIoYWVzKHltaW49c2NvcmUtc2QsIHltYXggPSBzY29yZStzZCksIHdpZHRoPTEsIHNpemU9MC4zLCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgpKSAreWxhYigiVkFNUC1zZXEgc2NvcmUiKSt0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSkgKyBzY2FsZV94X2Rpc2NyZXRlKGJyZWFrcyA9IHNlcSgwLCAyNDUsIDEwKSkgKyB4bGFiKCJlYWNoIGJhciBpcyBhIGRpZmZlcmVudCBzZWNvbmRhcnkgc3RydWN0dXJlIikKcGxvdCh0cG10X2FhX21lYW4pCmBgYApgYGB7ciBpbmNsdWRlPUZBTFNFfQojUFRFTgpwdGVuX3N1bSA8LSBzdW1tYXJ5U0UocHRlbjFfcHJvY193dCwgbWVhc3VyZXZhcj0ic2NvcmUiLCBncm91cHZhcnM9InBvc2l0aW9uIikKI2hlYWQocHRlbl9zdW0pCnB0ZW5fcG9zX21lYW4gPC0gZ2dwbG90KHB0ZW5fc3VtLCBhZXMoeD1wb3NpdGlvbiwgeT1zY29yZSkpKyBnZW9tX2Jhcihwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgpLCBzdGF0PSJpZGVudGl0eSIsIGNvbG91cj0iIzk5OTk5OSIpICsgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1zY29yZS1zZCwgeW1heCA9IHNjb3JlK3NkKSwgd2lkdGg9MSwgc2l6ZT0wLjMsIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKCkpICt5bGFiKCJWQU1QLXNlcSBzY29yZSIpK3RoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwgYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCkpICsgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCA0MDMsIDIwKSwgZXhwYW5kID0gYygwLDApKSArIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCkpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTE4NSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0uMSkgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MzUwLCBjb2xvcj0iYmxhY2siLCBzaXplPS4xKQpwdGVuX2hlYXQgPC0gZ2dwbG90KHB0ZW4xX3Byb2Nfd3QsIGFlcyhwb3NpdGlvbiwgZW5kKSkgKyBnZW9tX3RpbGUoYWVzKGZpbGw9c2NvcmUpKSArIHNjYWxlX2ZpbGxfZ3JhZGllbnRuKGNvbG91cnMgPSBjKCIjM0Y3Q0I5IiwgIiNGRkVBRjMiLCAiI0IyMUY0RSIpLCB2YWx1ZXMgPSBzY2FsZXM6OnJlc2NhbGUoYygtMC4yMywgMC40MiwgMSwgMS4yLCAxLjQ3KSkpKyBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDQwMywgMjApLCBleHBhbmQ9YygwLDApKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0nYm90dG9tJykreGxhYigiUG9zaXRpb24gaW4gVFBNVCIpICsgc2NhbGVfeV9kaXNjcmV0ZShleHBhbmQgPSBjKDAsMCkpCiNjKC0wLjcsIDAuMiwgMSwgMS4zLCAyLjAzKQojYygtMC4yMywgMC40MiwgMSwgMS4yLCAxLjQ3KQoKI2xvY2FsCnB0ZW5fZXh0cmEgPC0gcmVhZC50YWJsZShmaWxlID0gJ34vbGVrbGFiL2xla2xhYi9QVEVOX3Bvc2l0aW9uYWxfZGF0YS50c3YnLCBzZXAgPSAnXHQnLCBoZWFkZXIgPSBUUlVFKQpwdGVuX2Rzc3Bfc2NoZW1hdGljIDwtIGdncGxvdCgpICsgZ2d0aXRsZSgiUFRFTiBtZWFuIGFidW5kYW5jZSBzY29yZXMiKSArCiAgZ2VvbV9zZWdtZW50KGFlcyh4ID0gMSwgeSA9IDAsIHhlbmQgPSBtYXgocHRlbl9leHRyYSRwb3NpdGlvbikpLCB5ZW5kID0gMCwgc2l6ZSA9IDEsIGNvbG9yID0gImdyZXk3MCIpICsKICBnZW9tX3BvaW50KGRhdGEgPSBzdWJzZXQocHRlbl9leHRyYSwgIWlzLm5hKHhjYSkpLCBhZXMoeCA9IHBvc2l0aW9uLCB5ID0gMCksIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEuOCkgKwogIGdlb21fcG9pbnQoZGF0YSA9IHN1YnNldChwdGVuX2V4dHJhLCBzaGVldCA9PSAxKSwgYWVzKHggPSBwb3NpdGlvbiwgeSA9IDApLCBjb2xvciA9ICJwaW5rIiwgc2l6ZSA9IDEuNSkgKwogIGdlb21fcG9pbnQoZGF0YSA9IHN1YnNldChwdGVuX2V4dHJhLCBoZWxpeCA9PSAxKSwgYWVzKHggPSBwb3NpdGlvbiwgeSA9IDApLCBjb2xvciA9ICJjeWFuIiwgc2l6ZSA9IDEuNSkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgNDAzLCAyMCksIGV4cGFuZCA9IGMoMCwwKSkgKwogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBOVUxMLCBleHBhbmQgPSBjKDAsMCkpICt4bGFiKE5VTEwpICsgeWxhYihOVUxMKSArCiAgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9ibGFuaygpLCBheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCkpCgojcGxvdHMKcGxvdChwdGVuX3Bvc19tZWFuKQpwbG90KHB0ZW5faGVhdCkKcHRlbl9kc3NwX3NjaGVtYXRpYwoKYGBgCgoKYGBge3IgaW5jbHVkZT1GQUxTRX0KIy4uLnBvaW50bGVzcyB0byByZXByZXNlbnQgZGF0YSB0aGlzIHdheSAuLi4KCiNkYk5TRlAKI3NldHVwCnRwbXRfbWVyZ2VfY29weSA8LSB0cG10X21lcmdlCnRwbXRfbWVyZ2VfZXhwYW5kX2NvcHkgPC0gdHBtdF9tZXJnZV9leHBhbmQKI3RwbXRfbWVyZ2VfY29weSRTSUZUX2NvbnZlcnRlZF9yYW5rc2NvcmVbd2hpY2godHBtdF9tZXJnZV9jb3B5JFNJRlRfc2NvcmUgPT0gJy4nKV0gPSBOQQp0cG10X21lcmdlX2NvcHkkU0lGVF9zY29yZSA8LSBhcy5udW1lcmljKHRwbXRfbWVyZ2VfY29weSRTSUZUX3Njb3JlKQp0cG10X21lcmdlX2NvcHkkU0lGVF9jb252ZXJ0ZWRfcmFua3Njb3JlIDwtIGFzLm51bWVyaWModHBtdF9tZXJnZV9jb3B5JFNJRlRfY29udmVydGVkX3JhbmtzY29yZSkKdHBtdF9tZXJnZV9leHBhbmRfY29weSRQb2x5cGhlbjJfSFZBUl9zY29yZSA8LSBhcy5udW1lcmljKHRwbXRfbWVyZ2VfZXhwYW5kX2NvcHkkUG9seXBoZW4yX0hWQVJfc2NvcmUpCgojc2lmdF9zdW0KdHBtdF9zaWZ0X3N1bSA8LSBzdW1tYXJ5U0UodHBtdF9tZXJnZV9jb3B5LCBtZWFzdXJldmFyPSJTSUZUX3Njb3JlIiwgZ3JvdXB2YXJzPSJwb3NpdGlvbiIpCnRzc19wbG90IDwtIGdncGxvdCh0cG10X3NpZnRfc3VtLCBhZXMoeD1wb3NpdGlvbiwgeT1TSUZUX3Njb3JlKSkrIGdlb21fYmFyKHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKCksIHN0YXQ9ImlkZW50aXR5IiwgY29sb3VyPSIjOTk5OTk5IikgKyBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPVNJRlRfc2NvcmUtc2QsIHltYXggPVNJRlRfc2NvcmUrc2QpLCB3aWR0aD0xLCBzaXplPTAuMywgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoKSkgK3lsYWIoImRmTlNGUCBTSUZUIHNjb3JlIikrdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLCBheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSkgKyBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDI0NSwgMTApLCBleHBhbmQgPSBjKDAsMCkpICsgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSkKcGxvdCh0c3NfcGxvdCkKCiNIVkFSX3N1bQp0cG10X2h2YXJfc3VtIDwtc3VtbWFyeVNFKHRwbXRfbWVyZ2VfZXhwYW5kX2NvcHksIG1lYXN1cmV2YXI9IlBvbHlwaGVuMl9IVkFSX3Njb3JlIiwgZ3JvdXB2YXJzPSJwb3NpdGlvbiIpCnRoc19wbG90IDwtIGdncGxvdCh0cG10X2h2YXJfc3VtLCBhZXMoeD1wb3NpdGlvbiwgeT1Qb2x5cGhlbjJfSFZBUl9zY29yZSkpKyBnZW9tX2Jhcihwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgpLCBzdGF0PSJpZGVudGl0eSIsIGNvbG91cj0iIzk5OTk5OSIpICsgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1Qb2x5cGhlbjJfSFZBUl9zY29yZS1zZCwgeW1heCA9UG9seXBoZW4yX0hWQVJfc2NvcmUrc2QpLCB3aWR0aD0xLCBzaXplPTAuMywgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoKSkgK3lsYWIoImRmTlNGUCBIVkFSIHNjb3JlIikrdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLCBheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSkgKyBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDI0NSwgMTApLCBleHBhbmQgPSBjKDAsMCkpICsgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSkKcGxvdCh0aHNfcGxvdCkKYGBgCgpgYGB7cn0KI21ldGhvZDEgKGJhc2ljLCBmb3IgdmlzdWFsaXppbmcgaW4gcnN0dWRpbykKZ3JpZC5uZXdwYWdlKCkKZ3JpZC5kcmF3KHJiaW5kKGdncGxvdEdyb2IodHBtdF9kc3NwX3NjaGVtYXRpYyksIGdncGxvdEdyb2IodHBtdF9wb3NfbWVhbiksIGdncGxvdEdyb2IodHBtdF9oZWF0KSwgc2l6ZSA9ICJsYXN0IikpCgpncmlkLm5ld3BhZ2UoKQpncmlkLmRyYXcocmJpbmQoZ2dwbG90R3JvYihwdGVuX2Rzc3Bfc2NoZW1hdGljKSwgZ2dwbG90R3JvYihwdGVuX3Bvc19tZWFuKSwgZ2dwbG90R3JvYihwdGVuX2hlYXQpLCBzaXplID0gImxhc3QiKSkKYGBgCmBgYHtyIGluY2x1ZGU9RkFMU0V9CiNtZXRob2QyICh1c2UgZm9yIGZpbmFsIGxheW91dCwgc2l6ZSBzcGVjaWZpY2F0aW9uLCBkb3dubG9hZCkKZ0E9Z2dwbG90X2d0YWJsZShnZ3Bsb3RfYnVpbGQodHBtdF9wb3NfbWVhbikpCmdCPWdncGxvdF9ndGFibGUoZ2dwbG90X2J1aWxkKHRwbXRfaGVhdCkpCmdDPWdncGxvdF9ndGFibGUoZ2dwbG90X2J1aWxkKHRwbXRfZHNzcF9zY2hlbWF0aWMpKQpnYT1nZ3Bsb3RfZ3RhYmxlKGdncGxvdF9idWlsZChwdGVuX3Bvc19tZWFuKSkKZ2I9Z2dwbG90X2d0YWJsZShnZ3Bsb3RfYnVpbGQocHRlbl9oZWF0KSkKZ2M9Z2dwbG90X2d0YWJsZShnZ3Bsb3RfYnVpbGQocHRlbl9kc3NwX3NjaGVtYXRpYykpCm1heFdpZHRoID0gZ3JpZDo6dW5pdC5wbWF4KGdBJHdpZHRocywgZ0Ikd2lkdGhzLCBnQyR3aWR0aHMsIGdhJHdpZHRocywgZ2Ikd2lkdGhzLCBnYyR3aWR0aHMpCmdBJHdpZHRocyA8LSBhcy5saXN0KG1heFdpZHRoKQpnQiR3aWR0aHMgPC0gYXMubGlzdChtYXhXaWR0aCkKZ0Mkd2lkdGhzIDwtIGFzLmxpc3QobWF4V2lkdGgpCmdhJHdpZHRocyA8LSBhcy5saXN0KG1heFdpZHRoKQpnYiR3aWR0aHMgPC0gYXMubGlzdChtYXhXaWR0aCkKZ2Mkd2lkdGhzIDwtIGFzLmxpc3QobWF4V2lkdGgpCgpncmlkLm5ld3BhZ2UoKQoKI3N0b3JpbmcsIHdpdGggc3BlY2lmaWVkIHdpZHRocyEhCiNwZGYoJ3B0ZW5fdHBtdF9tZWFuX2hlYXQucGRmJywgd2lkdGg9OCwgaGVpZ2h0PTYpCiNncmlkLmFycmFuZ2UoYXJyYW5nZUdyb2IoZ0MsZ0EsZ0IsbnJvdz0zLGhlaWdodHM9YyguMSwuMywuOCkpKQojZ3JpZC5hcnJhbmdlKGFycmFuZ2VHcm9iKGdjLGdhLGdiLG5yb3c9MyxoZWlnaHRzPWMoLjEsLjMsLjgpKSkKI2Rldi5vZmYoKQpgYGAKYGBge3IgaW5jbHVkZT1GQUxTRX0KIyNhdHRlbXB0IHRvIG9yZGVyIGJ5IGFidW5kYW5jZS4uLgojdHBtdF9zdW1fbyA8LSB0cG10X3N1bVtvcmRlcih0cG10X3N1bSRzY29yZSksXQojdHBtdF9zdW1fbyRwb3NpdGlvbiA8LSBmYWN0b3IodHBtdF9zdW1fbyRwb3NpdGlvbiwgbGV2ZWxzPXRwbXRfc3VtX28kcG9zaXRpb25bb3JkZXIodHBtdF9zdW1fbyRzY29yZSldKQojdHBtdF9wb3NfbWVhbl9vIDwtIGdncGxvdCh0cG10X3N1bV9vLCBhZXMoeD1mYWN0b3IocG9zaXRpb24pLCB5PXNjb3JlKSkrIGdlb21fYmFyKHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKCksIHN0YXQ9ImlkZW50aXR5IiwgY29sb3VyPSIjOTk5OTk5IikgKyBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPXNjb3JlLXNkLCB5bWF4ID0gc2NvcmUrc2QpLCB3aWR0aD0wLjAwMSwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoKSkgK3lsYWIoIlZBTVAtc2VxIHNjb3JlIikrdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLCBheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSkgKyBzY2FsZV94X2Rpc2NyZXRlKGJyZWFrcyA9IHNlcSgwLCAyNTAsIDEwKSkKI2FhYSA8LSB0cG10MV9wcm9jX3d0CiNhYWEkbWVhbnMgPC0gdHBtdF9zdW1bbWF0Y2goYWFhJHBvc2l0aW9uLCB0cG10X3N1bSRwb3NpdGlvbiksMl0KI2JiYiA8LSBhYWFbb3JkZXIoYWFhJG1lYW4pLF0KI2JiYiRwb3NpdGlvbiA8LSBhcy5mYWN0b3IoYmJiJHBvc2l0aW9uKQojdHBtdF9oZWF0X28gPC0gZ2dwbG90KGJiYiwgYWVzKHg9ZmFjdG9yKHBvc2l0aW9uKSwgeT1lbmQpKSArIGdlb21fdGlsZShhZXMoZmlsbD1zY29yZSkpICsgc2NhbGVfZmlsbF9ncmFkaWVudG4oY29sb3VycyA9IGMoIiMzRjdDQjkiLCAiI0ZGRUFGMyIsICIjQjIxRjRFIiksIHZhbHVlcyA9IHNjYWxlczo6cmVzY2FsZShjKC0wLjcsIDAuMiwgMSwgMS4zLCAyLjAzKSkpKyBzY2FsZV94X2Rpc2NyZXRlKGJyZWFrcyA9IHNlcSgwLCAyNTAsIDEwKSkgKyB0aGVtZShsZWdlbmQucG9zaXRpb249J2JvdHRvbScpK3hsYWIoIlBvc2l0aW9uIGluIFRQTVQiKQoKI2FhYSRwb3NpdGlvbiA8LSBmYWN0b3IoYWFhJHBvc2l0aW9uLCBsZXZlbHM9dW5pcXVlKGFhYSRwb3NpdGlvbilbb3JkZXIoYWFhJG1lYW5zKV0pCiN0cG10X2hlYXRfbyA8LSBnZ3Bsb3QoYWFhLCBhZXMoeD1mYWN0b3IobWVhbiksIHk9ZW5kKSkgKyBnZW9tX3RpbGUoYWVzKGZpbGw9c2NvcmUpKSArIHNjYWxlX2ZpbGxfZ3JhZGllbnRuKGNvbG91cnMgPSBjKCIjM0Y3Q0I5IiwgIiNGRkVBRjMiLCAiI0IyMUY0RSIpLCB2YWx1ZXMgPSBzY2FsZXM6OnJlc2NhbGUoYygtMC43LCAwLjIsIDEsIDEuMywgMi4wMykpKSsgc2NhbGVfeF9kaXNjcmV0ZShicmVha3MgPSBzZXEoMCwgMjUwLCAxMCkpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSdib3R0b20nKSt4bGFiKCJQb3NpdGlvbiBpbiBUUE1UIikKI3RwbXRfZHNzcF9zY2hlbWF0aWMgPC0gZ2dwbG90KCkgKyBnZ3RpdGxlKCJUUE1UIG1lYW4gYWJ1bmRhbmNlIHNjb3JlcyIpICsKIyAgZ2VvbV9zZWdtZW50KGFlcyh4ID0gMSwgeSA9IDAsIHhlbmQgPSBtYXgodHBtdDFfZGF0YSRwb3NpdGlvbikpLCB5ZW5kID0gMCwgc2l6ZSA9IDEsIGNvbG9yID0gImdyZXk3MCIpICsKIyAgZ2VvbV9wb2ludChkYXRhID0gdHBtdDFfZGF0YSwgYWVzKHggPSBwb3NpdGlvbiwgeSA9IDApLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAxLjgpICsKIyAgZ2VvbV9wb2ludChkYXRhID0gc3Vic2V0KHRwbXQxX2RhdGEsIHNoZWV0ID09IDEpLCBhZXMoeCA9IHBvc2l0aW9uLCB5ID0gMCksIGNvbG9yID0gInBpbmsiLCBzaXplID0gMS41KSArCiMgIGdlb21fcG9pbnQoZGF0YSA9IHN1YnNldCh0cG10MV9kYXRhLCBoZWxpeCA9PSAxKSwgYWVzKHggPSBwb3NpdGlvbiwgeSA9IDApLCBjb2xvciA9ICJjeWFuIiwgc2l6ZSA9IDEuNSkgKwojICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDI1MCwgMTApLCBleHBhbmQgPSBjKDAsMCkpICsKIyAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IE5VTEwsIGV4cGFuZCA9IGMoMCwwKSkgK3hsYWIoTlVMTCkgKyB5bGFiKE5VTEwpICsKIyAgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9ibGFuaygpLCBheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCkpCiN0cG10X2Rzc3Bfc2NoZW1hdGljCiNwbG90KHRwbXRfcG9zX21lYW5fbykKI3Bsb3QodHBtdF9oZWF0X28pCmBgYApgYGB7cn0KI3Bsb3R0aW5nIG1lYW4gc2NvcmUgdnMgdmFyaWFudCBjaGFuZ2VkIHRvIAp0cG10X2VuZF9zdW0gPC0gc3VtbWFyeVNFKHRwbXQxX3Byb2Nfd3QsIG1lYXN1cmV2YXI9InNjb3JlIiwgZ3JvdXB2YXJzPSJlbmQiKQp0cG10X2VuZF9tZWFuIDwtIGdncGxvdCh0cG10X2VuZF9zdW0sIGFlcyh4PWVuZCwgeT1zY29yZSkpICsKICBnZW9tX2Jhcihwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgpLCBzdGF0PSJpZGVudGl0eSIsIGNvbG91cj0iIzk5OTk5OSIpICsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPXNjb3JlLXNkLCB5bWF4PXNjb3JlK3NkKSwgd2lkdGg9MC4wMDEsIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKCkpICsKICB5bGFiKCJtZWFuIGFidW5kYW5jZSIpICsgeGxhYigidmFyaWFudCBhbWlubyBhY2lkIikgKyB0aGVtZV9idygpCnBsb3QodHBtdF9lbmRfbWVhbikKCmBgYApgYGB7ciBpbmNsdWRlPUZBTFNFfQojcGxvdHRpbmcgc2NvcmVzIHZzIGVuZCBjb2xvcmVkIGJ5IGxvY2F0aW9uL3NlY29uZGFyeSBzdHJ1Y3R1cmUKI3RwbXRfZW5kX3Njb3Jlc19iIDwtIGdncGxvdChkYXRhPXN1YnNldCh0cG10MV9wcm9jX3d0LCBzaGVldD09MSksIGFlcyh4PWVuZCwgeT1zY29yZSwgY29sb3VyPXBvc2l0aW9uKSkgKwojICBnZW9tX3Zpb2xpbihkYXRhPXN1YnNldCh0cG10MV9wcm9jX3d0LCBzaGVldD09MSksIGRyYXdfcXVhbnRpbGVzPTAuNSwgc2NhbGUgPSAid2lkdGgiKSArCiMgIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQodHBtdDFfcHJvY193dCwgc2hlZXQ9PTEpLCBzaXplPS4zLCBhbHBoYSA9IDAuNiwgcG9zaXRpb249aml0dGVyMikgKyB5bGFiKCJhYnVuZGFuY2UiKSArIHhsYWIoInZhcmlhbnQgYWEiKSArCiMgIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKC0wLjgsIDIuMikpCgojdHBtdF9lbmRfc2NvcmVzX2EgPC0gZ2dwbG90KGRhdGE9c3Vic2V0KHRwbXQxX3Byb2Nfd3QsIGhlbGl4PT0xKSwgYWVzKHg9ZW5kLCB5PXNjb3JlLCBjb2xvdXI9cG9zaXRpb24pKSArCiMgIGdlb21fdmlvbGluKGRhdGE9c3Vic2V0KHRwbXQxX3Byb2Nfd3QsIGhlbGl4PT0xKSwgZHJhd19xdWFudGlsZXM9MC41LCBzY2FsZSA9ICJ3aWR0aCIpICsKIyAgZ2VvbV9wb2ludChkYXRhPXN1YnNldCh0cG10MV9wcm9jX3d0LCBoZWxpeD09MSksIHNpemU9LjMsIGFscGhhID0gMC42LCBwb3NpdGlvbj1qaXR0ZXIyKSArIHlsYWIoImFidW5kYW5jZSIpICsgeGxhYigidmFyaWFudCBhYSIpICsKIyAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLTAuOCwgMi4yKSkKCiN0cG10X2VuZF9zY29yZXNfbiA8LSBnZ3Bsb3QoZGF0YT1zdWJzZXQodHBtdDFfcHJvY193dCwgc2Vjb25kYXJ5X3N0cnVjdD09Im5laXRoZXIiKSwgYWVzKHg9ZW5kLCB5PXNjb3JlLCBjb2xvdXI9cG9zaXRpb24pKSArCiMgIGdlb21fdmlvbGluKGRhdGE9c3Vic2V0KHRwbXQxX3Byb2Nfd3QsIHNlY29uZGFyeV9zdHJ1Y3Q9PSJuZWl0aGVyIiksIGRyYXdfcXVhbnRpbGVzPTAuNSwgc2NhbGUgPSAid2lkdGgiKSArCiMgIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQodHBtdDFfcHJvY193dCwgc2Vjb25kYXJ5X3N0cnVjdD09Im5laXRoZXIiKSwgc2l6ZT0uMywgYWxwaGEgPSAwLjYsIHBvc2l0aW9uPWppdHRlcjIpICsgeWxhYigiYWJ1bmRhbmNlIikgKyB4bGFiKCJ2YXJpYW50IGFhIikgKwojICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtMC44LCAyLjIpKQoKI3Bsb3QodHBtdF9lbmRfc2NvcmVzX2IpCiNwbG90KHRwbXRfZW5kX3Njb3Jlc19hKQojcGxvdCh0cG10X2VuZF9zY29yZXNfbikKCiN0cG10X2VuZF9zY29yZXNfNjAgPC0gZ2dwbG90KGRhdGE9c3Vic2V0KHRwbXQxX3Byb2Nfd3QsIHBvc2l0aW9uPD02MCksIGFlcyh4PWVuZCwgeT1zY29yZSwgY29sb3VyPXBvc2l0aW9uKSkgKwojICBnZW9tX3Zpb2xpbihkYXRhPXN1YnNldCh0cG10MV9wcm9jX3d0LCBwb3NpdGlvbjw9NjApLCBkcmF3X3F1YW50aWxlcz0wLjUsIHNjYWxlID0gIndpZHRoIikgKwojICBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KHRwbXQxX3Byb2Nfd3QsIHBvc2l0aW9uPD02MCksIHNpemU9LjMsIGFscGhhID0gMC42LCBwb3NpdGlvbj1qaXR0ZXIyKSArIHlsYWIoImFidW5kYW5jZSIpICsgeGxhYigidmFyaWFudCBhYSIpICsKIyAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLTAuOCwgMi4yKSkKI3RwbXRfZW5kX3Njb3Jlc18xMjAgPC0gZ2dwbG90KGRhdGE9c3Vic2V0KHRwbXQxX3Byb2Nfd3QsIHBvc2l0aW9uPjYwICYgcG9zaXRpb248PTEyMCksIGFlcyh4PWVuZCwgeT1zY29yZSwgY29sb3VyPXBvc2l0aW9uKSkgKwojICBnZW9tX3Zpb2xpbihkYXRhPXN1YnNldCh0cG10MV9wcm9jX3d0LCBwb3NpdGlvbj42MCAmIHBvc2l0aW9uPD0xMjApLCBkcmF3X3F1YW50aWxlcz0wLjUsIHNjYWxlID0gIndpZHRoIikgKwojICBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KHRwbXQxX3Byb2Nfd3QsIHBvc2l0aW9uPjYwICYgcG9zaXRpb248PTEyMCksIHNpemU9LjMsIGFscGhhID0gMC42LCBwb3NpdGlvbj1qaXR0ZXIyKSArIHlsYWIoImFidW5kYW5jZSIpICsgeGxhYigidmFyaWFudCBhYSIpICsKIyAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLTAuOCwgMi4yKSkKI3RwbXRfZW5kX3Njb3Jlc18xODAgPC0gZ2dwbG90KGRhdGE9c3Vic2V0KHRwbXQxX3Byb2Nfd3QsIHBvc2l0aW9uPjEyMCAmIHBvc2l0aW9uPD0xODApLCBhZXMoeD1lbmQsIHk9c2NvcmUsIGNvbG91cj1wb3NpdGlvbikpICsKIyAgZ2VvbV92aW9saW4oZGF0YT1zdWJzZXQodHBtdDFfcHJvY193dCwgcG9zaXRpb24+MTIwICYgcG9zaXRpb248PTE4MCksIGRyYXdfcXVhbnRpbGVzPTAuNSwgc2NhbGUgPSAid2lkdGgiKSArCiMgIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQodHBtdDFfcHJvY193dCwgcG9zaXRpb24+MTIwICYgcG9zaXRpb248PTE4MCksIHNpemU9LjMsIGFscGhhID0gMC42LCBwb3NpdGlvbj1qaXR0ZXIyKSArIHlsYWIoImFidW5kYW5jZSIpICsgeGxhYigidmFyaWFudCBhYSIpICsKIyAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLTAuOCwgMi4yKSkKI3RwbXRfZW5kX3Njb3Jlc18yNDUgPC0gZ2dwbG90KGRhdGE9c3Vic2V0KHRwbXQxX3Byb2Nfd3QsIHBvc2l0aW9uPjE4MCAmIHBvc2l0aW9uPD0yNDUpLCBhZXMoeD1lbmQsIHk9c2NvcmUsIGNvbG91cj1wb3NpdGlvbikpICsKIyAgZ2VvbV92aW9saW4oZGF0YT1zdWJzZXQodHBtdDFfcHJvY193dCwgcG9zaXRpb24+MTgwICYgcG9zaXRpb248PTI0NSksIGRyYXdfcXVhbnRpbGVzPTAuNSwgc2NhbGUgPSAid2lkdGgiKSArCiMgIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQodHBtdDFfcHJvY193dCwgcG9zaXRpb24+MTgwICYgcG9zaXRpb248PTI0NSksIHNpemU9LjMsIGFscGhhID0gMC42LCBwb3NpdGlvbj1qaXR0ZXIyKSArIHlsYWIoImFidW5kYW5jZSIpICsgeGxhYigidmFyaWFudCBhYSIpICsKIyAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLTAuOCwgMi4yKSkKCiNwbG90KHRwbXRfZW5kX3Njb3Jlc182MCkKI3Bsb3QodHBtdF9lbmRfc2NvcmVzXzEyMCkKI3Bsb3QodHBtdF9lbmRfc2NvcmVzXzE4MCkKI3Bsb3QodHBtdF9lbmRfc2NvcmVzXzI0NSkKYGBgCgoKYGBge3IgZWNobz1GQUxTRX0Kc2V0LnNlZWQoMTUzKQpqaXR0ZXIgPC0gcG9zaXRpb25faml0dGVyKHdpZHRoID0gMSwgaGVpZ2h0ID0gTlVMTCkKaml0dGVyMSA8LXBvc2l0aW9uX2ppdHRlcih3aWR0aCA9IDAuMDgsIGhlaWdodCA9IE5VTEwpCmppdHRlcjIgPC0gcG9zaXRpb25faml0dGVyKHdpZHRoPTAuMTMsIGhlaWdodCA9IE5VTEwpCnR3ZW50eV9jb2xvciA9IGMoIiNEMDIwMjgiLCAiI0UxQTEyRiIsICIjRUREOTQxIiwgIiNGMkYwOEUiLCAiI0VFQzg5OCIsICIjQkNEREFFIiwgIiNBNEMzM0IiLCAiIzc2QzE1OCIsICIjODU3ODJFIiwgIiMzMTU5MzUiLCAiIzUzOTU4QiIsICIjQTFEQUUwIiwgIiM0ODZFQjYiLCAiI0U2QTNCNCIsICIjQzVBMENBIiwgIiM1NTREQTAiLCAiIzk5MjQ3RSIsICIjNDAyMDU5IiwgIiM4MjQyMUIiLCAiIzdFODA3RSIsICdibGFjaycpCgojcHRlbl9rX3NwcmVhZDEgPC0gZ2dwbG90KHB0ZW4xX3Byb2Nfd3QsIGFlcyh5PXNjb3JlLCB4PXN0YXJ0KSkgKyBnZW9tX3Zpb2xpbihkcmF3X3F1YW50aWxlcz1jKDAuNSksIGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHN0YXJ0PT0gIksiKSwgYWVzKGdyb3VwPWZhY3Rvcihwb3NpdGlvbikpKSArIHhsYWIoIlBvc2l0aW9uIGluIFBURU4iKSArIGdndGl0bGUoIkx5c2luZSB2YXJpYW50IGFidW5kYW5jZSBzY29yZXMiKQoKcHRlbl9rX3NwcmVhZDEgPC0gZ2dwbG90KHB0ZW4xX3Byb2Nfd3QsIGFlcyh5PXNjb3JlLCB4PWZhY3Rvcihwb3NpdGlvbiksIGNvbG91ciA9IGVuZCkpICsgZ2VvbV92aW9saW4oZHJhd19xdWFudGlsZXM9YygwLjUpLCBkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJLIiksIGFlcyhncm91cD1mYWN0b3IocG9zaXRpb24pKSwgc2NhbGUgPSAid2lkdGgiKSArIHhsYWIoIlBvc2l0aW9uIGluIFBURU4iKSArIGdndGl0bGUoIkx5c2luZSB2YXJpYW50IGFidW5kYW5jZSBzY29yZXMiKSsgZ2VvbV9wb2ludChkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJLIiksIGFlcyh4PWZhY3Rvcihwb3NpdGlvbiksIHk9c2NvcmUpLCBhbHBoYSA9IDAuODUsIHBvc2l0aW9uPWppdHRlcjIpICsgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz10d2VudHlfY29sb3IpICsgdGhlbWVfYncoKQpwdGVuX2tfYWEgPC0gZ2dwbG90KHB0ZW4xX3Byb2Nfd3QsIGFlcyh5PXNjb3JlLCB4PWVuZCwgY29sb3VyID0gZW5kKSkgKyBnZW9tX3Zpb2xpbihkcmF3X3F1YW50aWxlcz1jKDAuNSksIGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHN0YXJ0PT0gIksiKSwgYWVzKGdyb3VwPWVuZCksIHNjYWxlID0gIndpZHRoIikgKyB4bGFiKCJBbWlubyBhY2lkIikgKyBnZ3RpdGxlKCJMeXNpbmUgdmFyaWFudCBhYnVuZGFuY2Ugc2NvcmVzIikrIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiSyIpLCBhZXMoeD1lbmQsIHk9c2NvcmUpLCBhbHBoYSA9IDAuNzUsIHBvc2l0aW9uPWppdHRlcjEpICsgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz10d2VudHlfY29sb3IpICsgdGhlbWVfYncoKQoKcHRlbl9nX3NwcmVhZDEgPC0gZ2dwbG90KHB0ZW4xX3Byb2Nfd3QsIGFlcyh5PXNjb3JlLCB4PWZhY3Rvcihwb3NpdGlvbiksIGNvbG91ciA9IGVuZCkpICsgZ2VvbV92aW9saW4oZHJhd19xdWFudGlsZXM9YygwLjUpLCBkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJHIiksIGFlcyhncm91cD1mYWN0b3IocG9zaXRpb24pKSwgc2NhbGUgPSAid2lkdGgiKSArIHhsYWIoIlBvc2l0aW9uIGluIFBURU4iKSArIGdndGl0bGUoIkdseWNpbmUgdmFyaWFudCBhYnVuZGFuY2Ugc2NvcmVzIikrIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiRyIpLCBhZXMoeD1mYWN0b3IocG9zaXRpb24pLCB5PXNjb3JlKSwgYWxwaGEgPSAwLjg1LCBwb3NpdGlvbj1qaXR0ZXIyKSArIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9dHdlbnR5X2NvbG9yKSArIHRoZW1lX2J3KCkKcHRlbl9nX2FhIDwtIGdncGxvdChwdGVuMV9wcm9jX3d0LCBhZXMoeT1zY29yZSwgeD1lbmQsIGNvbG91ciA9IGVuZCkpICsgZ2VvbV92aW9saW4oZHJhd19xdWFudGlsZXM9YygwLjUpLCBkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJHIiksIGFlcyhncm91cD1lbmQpLCBzY2FsZSA9ICJ3aWR0aCIpICsgeGxhYigiQW1pbm8gYWNpZCIpICsgZ2d0aXRsZSgiR2x5Y2luZSB2YXJpYW50IGFidW5kYW5jZSBzY29yZXMiKSsgZ2VvbV9wb2ludChkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJHIiksIGFlcyh4PWVuZCwgeT1zY29yZSksIGFscGhhID0gMC43NSwgcG9zaXRpb249aml0dGVyMSkgKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPXR3ZW50eV9jb2xvcikgKyB0aGVtZV9idygpCnB0ZW5fZ19oeWRyb2RpZmYgPC0gZ2dwbG90KHB0ZW4xX3Byb2Nfd3QsIGFlcyh5PXNjb3JlLCB4PWZhY3Rvcihwb3NpdGlvbiksIGNvbG91ciA9IChoeWRybzItaHlkcm8xKSkpICsgZ2VvbV92aW9saW4oZHJhd19xdWFudGlsZXM9YygwLjUpLCBkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJHIiksIGFlcyhncm91cD1mYWN0b3IocG9zaXRpb24pKSwgc2NhbGUgPSAid2lkdGgiKSArIHhsYWIoIlBvc2l0aW9uIGluIFBURU4iKSArIGdndGl0bGUoIkdseWNpbmUgdmFyaWFudCBhYnVuZGFuY2Ugc2NvcmVzIHcvIGh5ZHJvcGhvYmljaXR5IGNoYW5nZSIpKyBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHN0YXJ0PT0gIkciKSwgYWVzKHg9ZmFjdG9yKHBvc2l0aW9uKSwgeT1zY29yZSksIGFscGhhID0gMC44NSwgcG9zaXRpb249aml0dGVyMikgKyBzY2FsZV9jb2xvcl9kaXN0aWxsZXIocGFsZXR0ZSA9ICJTcGVjdHJhbCIpICsgdGhlbWVfYncoKQoKcHRlbl9jX3NwcmVhZCA8LSBnZ3Bsb3QocHRlbjFfcHJvY193dCwgYWVzKHk9c2NvcmUsIHg9cG9zaXRpb24pKSArIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiQyIpKSArIHhsYWIoIlBvc2l0aW9uIGluIFBURU4iKSArIGdndGl0bGUoIkN5c3RlaW5lIHZhcmlhbnQgYWJ1bmRhbmNlIHNjb3JlcyIpICsgdGhlbWVfYncoKQojZXhwZXJpbWVudF9vcmlnCiNwdGVuX2Nfc3ByZWFkMSA8LSBnZ3Bsb3QocHRlbjFfcHJvY193dCwgYWVzKHk9c2NvcmUsIHg9cG9zaXRpb24sIGNvbG91ciA9IGVuZCkpICsgZ2VvbV92aW9saW4oZHJhd19xdWFudGlsZXM9YygwLjUpLCBkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJDIiksIGFlcyhncm91cD1wb3NpdGlvbiUlNDUwKSwgc2NhbGUgPSAid2lkdGgiKSArIHhsYWIoIlBvc2l0aW9uIGluIFBURU4iKSArIGdndGl0bGUoIkN5c3RlaW5lIHZhcmlhbnQgYWJ1bmRhbmNlIHNjb3JlcyIpKyBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHN0YXJ0PT0gIkMiKSwgYWVzKHg9cG9zaXRpb24sIHk9c2NvcmUpLCBhbHBoYSA9IDAuNzUsIHBvc2l0aW9uPWppdHRlcikgKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoIiNEMDIwMjgiLCAiI0UxQTEyRiIsICIjRUREOTQxIiwgIiNGMkYwOEUiLCAiI0VFQzg5OCIsICIjQkNEREFFIiwgIiNBNEMzM0IiLCAiIzc2QzE1OCIsICIjODU3ODJFIiwgIiMzMTU5MzUiLCAiIzUzOTU4QiIsICIjQTFEQUUwIiwgIiM0ODZFQjYiLCAiI0U2QTNCNCIsICIjQzVBMENBIiwgIiM1NTREQTAiLCAiIzk5MjQ3RSIsICIjNDAyMDU5IiwgIiM4MjQyMUIiLCAiIzdFODA3RSIsICdibGFjaycpKQojLCBzY2FsZSA9ICJjb3VudCIKIysgZ2VvbV9wb2ludChkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJDIiksIGFlcyh4PXBvc2l0aW9uLCB5PXNjb3JlKSwgYWxwaGEgPSAwLjUpCnB0ZW5fY19zcHJlYWQxIDwtIGdncGxvdChwdGVuMV9wcm9jX3d0LCBhZXMoeT1zY29yZSwgeD1wb3NpdGlvbiwgY29sb3VyID0gZW5kKSkgKyBnZW9tX3Zpb2xpbihkcmF3X3F1YW50aWxlcz1jKDAuNSksIGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHN0YXJ0PT0gIkMiKSwgYWVzKGdyb3VwPXBvc2l0aW9uJSU0NTApLCBzY2FsZSA9ICJ3aWR0aCIpICsgeGxhYigiUG9zaXRpb24gaW4gUFRFTiIpICsgZ2d0aXRsZSgiQ3lzdGVpbmUgdmFyaWFudCBhYnVuZGFuY2Ugc2NvcmVzIikrIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiQyIpLCBhZXMoeD1wb3NpdGlvbiwgeT1zY29yZSksIGFscGhhID0gMC43NSwgcG9zaXRpb249aml0dGVyMSkgKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPXR3ZW50eV9jb2xvcikgKyB0aGVtZV9idygpCnB0ZW5fY19hYSA8LSBnZ3Bsb3QocHRlbjFfcHJvY193dCwgYWVzKHk9c2NvcmUsIHg9ZW5kLCBjb2xvdXIgPSBlbmQpKSArIGdlb21fdmlvbGluKGRyYXdfcXVhbnRpbGVzPWMoMC41KSwgZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiQyIpLCBhZXMoZ3JvdXA9ZW5kKSwgc2NhbGUgPSAid2lkdGgiKSArIHhsYWIoIkFtaW5vIGFjaWQiKSArIGdndGl0bGUoIkN5c3RlaW5lIHZhcmlhbnQgYWJ1bmRhbmNlIHNjb3JlcyIpKyBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHN0YXJ0PT0gIkMiKSwgYWVzKHg9ZW5kLCB5PXNjb3JlKSwgYWxwaGEgPSAwLjc1LCBwb3NpdGlvbj1qaXR0ZXIxKSArIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9dHdlbnR5X2NvbG9yKSArIHRoZW1lX2J3KCkKCnB0ZW5fY19oeWRyb2RpZmYgPC0gZ2dwbG90KHB0ZW4xX3Byb2Nfd3QsIGFlcyh5PXNjb3JlLCB4PXBvc2l0aW9uLCBjb2xvdXIgPSAoaHlkcm8yLWh5ZHJvMSkpKSArIGdlb21fdmlvbGluKGRyYXdfcXVhbnRpbGVzPWMoMC41KSwgZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiQyIpLCBhZXMoZ3JvdXA9cG9zaXRpb24lJTQ1MCksIHNjYWxlID0gIndpZHRoIikgKyB4bGFiKCJQb3NpdGlvbiBpbiBQVEVOIikgKyBnZ3RpdGxlKCJDeXN0ZWluZSB2YXJpYW50IGFidW5kYW5jZSBzY29yZXMgdy8gaHlkcm9waG9iaWNpdHkgY2hhbmdlIikrIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiQyIpLCBhZXMoeD1wb3NpdGlvbiwgeT1zY29yZSksIGFscGhhID0gMC43NSwgcG9zaXRpb249aml0dGVyMSkgKyBzY2FsZV9jb2xvcl9kaXN0aWxsZXIocGFsZXR0ZSA9ICJTcGVjdHJhbCIpICsgdGhlbWVfYncoKQojaW4gaW4gZ2VvbV92aW9saW4oYWVzKCkpIC0+IGNvbG91ciA9IGh5ZHJvMQoKCiNwdGVuX3Nfc3ByZWFkIDwtIGdncGxvdChwdGVuMV9wcm9jX3d0LCBhZXMoeT1zY29yZSwgeD1wb3NpdGlvbikpICsgZ2VvbV9wb2ludChkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJTIikpICsgeGxhYigiUG9zaXRpb24gaW4gUFRFTiIpICsgZ2d0aXRsZSgiU2VyaW5lIHZhcmlhbnQgYWJ1bmRhbmNlIHNjb3JlcyIpCiNwdGVuX3Nfc3ByZWFkMV9vbGQgPC0gZ2dwbG90KHB0ZW4xX3Byb2Nfd3QsIGFlcyh5PXNjb3JlLCB4PXN0YXJ0KSkgKyBnZW9tX3Zpb2xpbihkcmF3X3F1YW50aWxlcz1jKDAuNSksIGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHN0YXJ0PT0gIlMiKSwgYWVzKGdyb3VwPWZhY3Rvcihwb3NpdGlvbikpKSArIHhsYWIoIlBvc2l0aW9uIGluIFBURU4iKSArIGdndGl0bGUoIlNlcmluZSB2YXJpYW50IGFidW5kYW5jZSBzY29yZXMiKQpwdGVuX3Nfc3ByZWFkMSA8LSBnZ3Bsb3QocHRlbjFfcHJvY193dCwgYWVzKHk9c2NvcmUsIHg9ZmFjdG9yKHBvc2l0aW9uKSwgY29sb3VyID0gZW5kKSkgKyBnZW9tX3Zpb2xpbihkcmF3X3F1YW50aWxlcz1jKDAuNSksIGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHN0YXJ0PT0gIlMiKSwgYWVzKGdyb3VwPWZhY3Rvcihwb3NpdGlvbikpLCBzY2FsZSA9ICJ3aWR0aCIpICsgeGxhYigiUG9zaXRpb24gaW4gUFRFTiIpICsgZ2d0aXRsZSgiU2VyaW5lIHZhcmlhbnQgYWJ1bmRhbmNlIHNjb3JlcyIpKyBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHN0YXJ0PT0gIlMiKSwgYWVzKHg9ZmFjdG9yKHBvc2l0aW9uKSwgeT1zY29yZSksIGFscGhhID0gMC44NSwgcG9zaXRpb249aml0dGVyMikgKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPXR3ZW50eV9jb2xvcikgKyB0aGVtZV9idygpCnB0ZW5fc19hYSA8LSBnZ3Bsb3QocHRlbjFfcHJvY193dCwgYWVzKHk9c2NvcmUsIHg9ZW5kLCBjb2xvdXIgPSBlbmQpKSArIGdlb21fdmlvbGluKGRyYXdfcXVhbnRpbGVzPWMoMC41KSwgZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiUyIpLCBhZXMoZ3JvdXA9ZW5kKSwgc2NhbGUgPSAid2lkdGgiKSArIHhsYWIoIkFtaW5vIGFjaWQiKSArIGdndGl0bGUoIlNlcmluZSB2YXJpYW50IGFidW5kYW5jZSBzY29yZXMiKSsgZ2VvbV9wb2ludChkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJTIiksIGFlcyh4PWVuZCwgeT1zY29yZSksIGFscGhhID0gMC43NSwgcG9zaXRpb249aml0dGVyMSkgKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPXR3ZW50eV9jb2xvcikgKyB0aGVtZV9idygpCgpwdGVuX3NfaHlkcm9kaWZmIDwtIGdncGxvdChwdGVuMV9wcm9jX3d0LCBhZXMoeT1zY29yZSwgeD1mYWN0b3IocG9zaXRpb24pLCBjb2xvdXIgPSAoaHlkcm8yLWh5ZHJvMSkpKSArIGdlb21fdmlvbGluKGRyYXdfcXVhbnRpbGVzPWMoMC41KSwgZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiUyIpLCBhZXMoZ3JvdXA9ZmFjdG9yKHBvc2l0aW9uKSksIHNjYWxlID0gIndpZHRoIikgKyB4bGFiKCJQb3NpdGlvbiBpbiBQVEVOIikgKyBnZ3RpdGxlKCJTZXJpbmUgdmFyaWFudCBhYnVuZGFuY2Ugc2NvcmVzIHcvIGh5ZHJvcGhvYmljaXR5IGNoYW5nZSIpKyBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHN0YXJ0PT0gIlMiKSwgYWVzKHg9ZmFjdG9yKHBvc2l0aW9uKSwgeT1zY29yZSksIGFscGhhID0gMC44NSwgcG9zaXRpb249aml0dGVyMikgKyBzY2FsZV9jb2xvcl9kaXN0aWxsZXIocGFsZXR0ZSA9ICJTcGVjdHJhbCIpICsgdGhlbWVfYncoKQojZ3JhcGhpbmcgYWJ1bmRhbmNlIHZzIGNoYW5nZSBpbiBoeWRyb3Bob2JpY2l0eQpwdGVuX3NfaGhfaHlkcm9kaWZmIDwtIGdncGxvdChwdGVuMV9wcm9jX3d0LCBhZXMoeT1zY29yZSwgeD1mYWN0b3IoaHlkcm8yLWh5ZHJvMSksIGNvbG91ciA9IChoeWRybzItaHlkcm8xKSkpICsgZ2VvbV92aW9saW4oZHJhd19xdWFudGlsZXM9YygwLjUpLCBkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJTIiksIGFlcyhncm91cD1mYWN0b3IoaHlkcm8yLWh5ZHJvMSkpLCBzY2FsZSA9ICJ3aWR0aCIpICsgeGxhYigiQ2hhbmdlIGluIGh5ZHJvcGhvYmljaXR5IikgKyBnZ3RpdGxlKCJTZXJpbmUgdmFyaWFudCBhYnVuZGFuY2Ugc2NvcmVzIikrIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiUyIpLCBhZXMoeD1mYWN0b3IoaHlkcm8yLWh5ZHJvMSksIHk9c2NvcmUpLCBhbHBoYSA9IDAuNzUsIHBvc2l0aW9uPWppdHRlcjEpICsgdGhlbWVfYncoKQojcHRlbl9zX2FhX2h5ZHJvZGlmZiA8LSBnZ3Bsb3QocHRlbjFfcHJvY193dCwgYWVzKHk9c2NvcmUsIHg9ZW5kLCBjb2xvdXIgPSAoaHlkcm8yLWh5ZHJvMSkpKSArIGdlb21fdmlvbGluKGRyYXdfcXVhbnRpbGVzPWMoMC41KSwgZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiUyIpLCBhZXMoZ3JvdXA9ZW5kKSwgc2NhbGUgPSAid2lkdGgiKSArIHhsYWIoIkFtaW5vIGFjaWQiKSArIGdndGl0bGUoIlNlcmluZSB2YXJpYW50IGFidW5kYW5jZSBzY29yZXMiKSsgZ2VvbV9wb2ludChkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJTIiksIGFlcyh4PWVuZCwgeT1zY29yZSksIGFscGhhID0gMC43NSwgcG9zaXRpb249aml0dGVyMSkKI3B0ZW5fc19hYV92b2xkaWZmIDwtIGdncGxvdChwdGVuMV9wcm9jX3d0LCBhZXMoeT1zY29yZSwgeD1lbmQsIGNvbG91ciA9IHZvbGRpZmYpKSArIGdlb21fdmlvbGluKGRyYXdfcXVhbnRpbGVzPWMoMC41KSwgZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiUyIpLCBhZXMoZ3JvdXA9ZW5kKSwgc2NhbGUgPSAid2lkdGgiKSArIHhsYWIoIkFtaW5vIGFjaWQiKSArIGdndGl0bGUoIlNlcmluZSB2YXJpYW50IGFidW5kYW5jZSBzY29yZXMiKSsgZ2VvbV9wb2ludChkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJTIiksIGFlcyh4PWVuZCwgeT1zY29yZSksIGFscGhhID0gMC43NSwgcG9zaXRpb249aml0dGVyMSkKI3B0ZW5fc19hYV9wb2xkaWZmIDwtIGdncGxvdChwdGVuMV9wcm9jX3d0LCBhZXMoeT1zY29yZSwgeD1lbmQsIGNvbG91ciA9IHBvbGFyaXR5ZGlmZikpICsgZ2VvbV92aW9saW4oZHJhd19xdWFudGlsZXM9YygwLjUpLCBkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJTIiksIGFlcyhncm91cD1lbmQpLCBzY2FsZSA9ICJ3aWR0aCIpICsgeGxhYigiQW1pbm8gYWNpZCIpICsgZ2d0aXRsZSgiU2VyaW5lIHZhcmlhbnQgYWJ1bmRhbmNlIHNjb3JlcyIpKyBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHN0YXJ0PT0gIlMiKSwgYWVzKHg9ZW5kLCB5PXNjb3JlKSwgYWxwaGEgPSAwLjc1LCBwb3NpdGlvbj1qaXR0ZXIxKQojcHRlbl9zX2FhX3dlaWdodGRpZmYgPC0gZ2dwbG90KHB0ZW4xX3Byb2Nfd3QsIGFlcyh5PXNjb3JlLCB4PWVuZCwgY29sb3VyID0gd2VpZ2h0ZGlmZikpICsgZ2VvbV92aW9saW4oZHJhd19xdWFudGlsZXM9YygwLjUpLCBkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJTIiksIGFlcyhncm91cD1lbmQpLCBzY2FsZSA9ICJ3aWR0aCIpICsgeGxhYigiQW1pbm8gYWNpZCIpICsgZ2d0aXRsZSgiU2VyaW5lIHZhcmlhbnQgYWJ1bmRhbmNlIHNjb3JlcyIpKyBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHN0YXJ0PT0gIlMiKSwgYWVzKHg9ZW5kLCB5PXNjb3JlKSwgYWxwaGEgPSAwLjc1LCBwb3NpdGlvbj1qaXR0ZXIxKQoKI3NwZWNpZmljIGFtaW5vIGFjaWQgdGVzdHMKIyNwbG90KHB0ZW5fa19zcHJlYWQpCiMjcGxvdChwdGVuX2dfc3ByZWFkKQojI3Bsb3QocHRlbl9jX3NwcmVhZCkKCiMjcGxvdChwdGVuX3Nfc3ByZWFkKQojI3Bsb3QocHRlbl9zX3NwcmVhZDFfb2xkKQoKI3Bsb3QocHRlbl9zX2hoX2h5ZHJvZGlmZikgI3Byb2JhYmx5IG5vdCB2ZXJ5IHVzZWZ1bC4uLiBkb2VzIG5vdCB0YWtlIGludG8gYWNjb3VudCBwb3NpdGlvbiBhbnltb3JlCiMjcGxvdChwdGVuX3NfYWFfaHlkcm9kaWZmKQojI3Bsb3QocHRlbl9zX2FhX3ZvbGRpZmYpCiMjcGxvdChwdGVuX3NfYWFfcG9sZGlmZikKIyNwbG90KHB0ZW5fc19hYV93ZWlnaHRkaWZmKQoKCnBsb3QocHRlbl9jX3NwcmVhZDEpCnBsb3QocHRlbl9jX2FhKQpwbG90KHB0ZW5fY19oeWRyb2RpZmYpCnBsb3QocHRlbl9zX3NwcmVhZDEpCnBsb3QocHRlbl9zX2FhKQpwbG90KHB0ZW5fc19oeWRyb2RpZmYpCnBsb3QocHRlbl9nX3NwcmVhZDEpCnBsb3QocHRlbl9nX2FhKQpwbG90KHB0ZW5fZ19oeWRyb2RpZmYpCnBsb3QocHRlbl9rX3NwcmVhZDEpCnBsb3QocHRlbl9rX2FhKQpgYGAKCmBgYHtyfQpwdGVuX2Ffc3ByZWFkMSA8LSBnZ3Bsb3QocHRlbjFfcHJvY193dCwgYWVzKHk9c2NvcmUsIHg9ZmFjdG9yKHBvc2l0aW9uKSwgY29sb3VyID0gZW5kKSkgKyBnZW9tX3Zpb2xpbihkcmF3X3F1YW50aWxlcz1jKDAuNSksIGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHN0YXJ0PT0gIkEiKSwgYWVzKGdyb3VwPWZhY3Rvcihwb3NpdGlvbikpLCBzY2FsZSA9ICJ3aWR0aCIpICsgeGxhYigiUG9zaXRpb24gaW4gUFRFTiIpICsgZ2d0aXRsZSgiQWxhbmluZSB2YXJpYW50IGFidW5kYW5jZSBzY29yZXMiKSsgZ2VvbV9wb2ludChkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJBIiksIGFlcyh4PWZhY3Rvcihwb3NpdGlvbiksIHk9c2NvcmUpLCBhbHBoYSA9IDAuODUsIHBvc2l0aW9uPWppdHRlcjIpICsgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz10d2VudHlfY29sb3IpICsgdGhlbWVfYncoKQpwdGVuX2FfYWEgPC0gZ2dwbG90KHB0ZW4xX3Byb2Nfd3QsIGFlcyh5PXNjb3JlLCB4PWVuZCwgY29sb3VyID0gZW5kKSkgKyBnZW9tX3Zpb2xpbihkcmF3X3F1YW50aWxlcz1jKDAuNSksIGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHN0YXJ0PT0gIkEiKSwgYWVzKGdyb3VwPWVuZCksIHNjYWxlID0gIndpZHRoIikgKyB4bGFiKCJBbWlubyBhY2lkIikgKyBnZ3RpdGxlKCJBbGFuaW5lIHZhcmlhbnQgYWJ1bmRhbmNlIHNjb3JlcyIpKyBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHN0YXJ0PT0gIkEiKSwgYWVzKHg9ZW5kLCB5PXNjb3JlKSwgYWxwaGEgPSAwLjc1LCBwb3NpdGlvbj1qaXR0ZXIxKSArIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9dHdlbnR5X2NvbG9yKSArIHRoZW1lX2J3KCkKCnB0ZW5fcl9zcHJlYWQxIDwtIGdncGxvdChwdGVuMV9wcm9jX3d0LCBhZXMoeT1zY29yZSwgeD1mYWN0b3IocG9zaXRpb24pLCBjb2xvdXIgPSBlbmQpKSArIGdlb21fdmlvbGluKGRyYXdfcXVhbnRpbGVzPWMoMC41KSwgZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiUiIpLCBhZXMoZ3JvdXA9ZmFjdG9yKHBvc2l0aW9uKSksIHNjYWxlID0gIndpZHRoIikgKyB4bGFiKCJQb3NpdGlvbiBpbiBQVEVOIikgKyBnZ3RpdGxlKCJBcmdhbmluZSB2YXJpYW50IGFidW5kYW5jZSBzY29yZXMiKSsgZ2VvbV9wb2ludChkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJSIiksIGFlcyh4PWZhY3Rvcihwb3NpdGlvbiksIHk9c2NvcmUpLCBhbHBoYSA9IDAuODUsIHBvc2l0aW9uPWppdHRlcjIpICsgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz10d2VudHlfY29sb3IpICsgdGhlbWVfYncoKQpwdGVuX3JfYWEgPC0gZ2dwbG90KHB0ZW4xX3Byb2Nfd3QsIGFlcyh5PXNjb3JlLCB4PWVuZCwgY29sb3VyID0gZW5kKSkgKyBnZW9tX3Zpb2xpbihkcmF3X3F1YW50aWxlcz1jKDAuNSksIGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHN0YXJ0PT0gIlIiKSwgYWVzKGdyb3VwPWVuZCksIHNjYWxlID0gIndpZHRoIikgKyB4bGFiKCJBbWlubyBhY2lkIikgKyBnZ3RpdGxlKCJBcmdhbmluZSB2YXJpYW50IGFidW5kYW5jZSBzY29yZXMiKSsgZ2VvbV9wb2ludChkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJSIiksIGFlcyh4PWVuZCwgeT1zY29yZSksIGFscGhhID0gMC43NSwgcG9zaXRpb249aml0dGVyMSkgKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPXR3ZW50eV9jb2xvcikgKyB0aGVtZV9idygpCgpwdGVuX25fc3ByZWFkMSA8LSBnZ3Bsb3QocHRlbjFfcHJvY193dCwgYWVzKHk9c2NvcmUsIHg9ZmFjdG9yKHBvc2l0aW9uKSwgY29sb3VyID0gZW5kKSkgKyBnZW9tX3Zpb2xpbihkcmF3X3F1YW50aWxlcz1jKDAuNSksIGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHN0YXJ0PT0gIk4iKSwgYWVzKGdyb3VwPWZhY3Rvcihwb3NpdGlvbikpLCBzY2FsZSA9ICJ3aWR0aCIpICsgeGxhYigiUG9zaXRpb24gaW4gUFRFTiIpICsgZ2d0aXRsZSgiQXNwYXJhZ2luZSB2YXJpYW50IGFidW5kYW5jZSBzY29yZXMiKSsgZ2VvbV9wb2ludChkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJOIiksIGFlcyh4PWZhY3Rvcihwb3NpdGlvbiksIHk9c2NvcmUpLCBhbHBoYSA9IDAuODUsIHBvc2l0aW9uPWppdHRlcjIpICsgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz10d2VudHlfY29sb3IpICsgdGhlbWVfYncoKQpwdGVuX25fYWEgPC0gZ2dwbG90KHB0ZW4xX3Byb2Nfd3QsIGFlcyh5PXNjb3JlLCB4PWVuZCwgY29sb3VyID0gZW5kKSkgKyBnZW9tX3Zpb2xpbihkcmF3X3F1YW50aWxlcz1jKDAuNSksIGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHN0YXJ0PT0gIk4iKSwgYWVzKGdyb3VwPWVuZCksIHNjYWxlID0gIndpZHRoIikgKyB4bGFiKCJBbWlubyBhY2lkIikgKyBnZ3RpdGxlKCJBc3BhcmFnaW5lIHZhcmlhbnQgYWJ1bmRhbmNlIHNjb3JlcyIpKyBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHN0YXJ0PT0gIk4iKSwgYWVzKHg9ZW5kLCB5PXNjb3JlKSwgYWxwaGEgPSAwLjc1LCBwb3NpdGlvbj1qaXR0ZXIxKSArIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9dHdlbnR5X2NvbG9yKSArIHRoZW1lX2J3KCkKCnB0ZW5fZF9zcHJlYWQxIDwtIGdncGxvdChwdGVuMV9wcm9jX3d0LCBhZXMoeT1zY29yZSwgeD1mYWN0b3IocG9zaXRpb24pLCBjb2xvdXIgPSBlbmQpKSArIGdlb21fdmlvbGluKGRyYXdfcXVhbnRpbGVzPWMoMC41KSwgZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiRCIpLCBhZXMoZ3JvdXA9ZmFjdG9yKHBvc2l0aW9uKSksIHNjYWxlID0gIndpZHRoIikgKyB4bGFiKCJQb3NpdGlvbiBpbiBQVEVOIikgKyBnZ3RpdGxlKCJBc3BhcnRpYyBBY2lkIHZhcmlhbnQgYWJ1bmRhbmNlIHNjb3JlcyIpKyBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHN0YXJ0PT0gIkQiKSwgYWVzKHg9ZmFjdG9yKHBvc2l0aW9uKSwgeT1zY29yZSksIGFscGhhID0gMC44NSwgcG9zaXRpb249aml0dGVyMikgKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPXR3ZW50eV9jb2xvcikgKyB0aGVtZV9idygpCnB0ZW5fZF9hYSA8LSBnZ3Bsb3QocHRlbjFfcHJvY193dCwgYWVzKHk9c2NvcmUsIHg9ZW5kLCBjb2xvdXIgPSBlbmQpKSArIGdlb21fdmlvbGluKGRyYXdfcXVhbnRpbGVzPWMoMC41KSwgZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiRCIpLCBhZXMoZ3JvdXA9ZW5kKSwgc2NhbGUgPSAid2lkdGgiKSArIHhsYWIoIkFtaW5vIGFjaWQiKSArIGdndGl0bGUoIkFzcGFydGljIEFjaWQgdmFyaWFudCBhYnVuZGFuY2Ugc2NvcmVzIikrIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiRCIpLCBhZXMoeD1lbmQsIHk9c2NvcmUpLCBhbHBoYSA9IDAuNzUsIHBvc2l0aW9uPWppdHRlcjEpICsgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz10d2VudHlfY29sb3IpICsgdGhlbWVfYncoKQoKcHRlbl9uX2h5ZHJvZGlmZiA8LSBnZ3Bsb3QocHRlbjFfcHJvY193dCwgYWVzKHk9c2NvcmUsIHg9ZmFjdG9yKHBvc2l0aW9uKSwgY29sb3VyID0gKGh5ZHJvMi1oeWRybzEpKSkgKyBnZW9tX3Zpb2xpbihkcmF3X3F1YW50aWxlcz1jKDAuNSksIGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHN0YXJ0PT0gIk4iKSwgYWVzKGdyb3VwPWZhY3Rvcihwb3NpdGlvbikpLCBzY2FsZSA9ICJ3aWR0aCIpICsgeGxhYigiUG9zaXRpb24gaW4gUFRFTiIpICsgZ2d0aXRsZSgiQXNwYXJhZ2luZSB2YXJpYW50IGFidW5kYW5jZSBzY29yZXMgdy8gaHlkcm9waG9iaWNpdHkgY2hhbmdlIikrIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiTiIpLCBhZXMoeD1mYWN0b3IocG9zaXRpb24pLCB5PXNjb3JlKSwgYWxwaGEgPSAwLjg1LCBwb3NpdGlvbj1qaXR0ZXIyKSArIHNjYWxlX2NvbG9yX2Rpc3RpbGxlcihwYWxldHRlID0gIlNwZWN0cmFsIikgKyB0aGVtZV9idygpCgpwdGVuX2RfaHlkcm9kaWZmIDwtIGdncGxvdChwdGVuMV9wcm9jX3d0LCBhZXMoeT1zY29yZSwgeD1mYWN0b3IocG9zaXRpb24pLCBjb2xvdXIgPSAoaHlkcm8yLWh5ZHJvMSkpKSArIGdlb21fdmlvbGluKGRyYXdfcXVhbnRpbGVzPWMoMC41KSwgZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiRCIpLCBhZXMoZ3JvdXA9ZmFjdG9yKHBvc2l0aW9uKSksIHNjYWxlID0gIndpZHRoIikgKyB4bGFiKCJQb3NpdGlvbiBpbiBQVEVOIikgKyBnZ3RpdGxlKCJBc3BhcnRpYyBBY2lkIHZhcmlhbnQgYWJ1bmRhbmNlIHNjb3JlcyB3LyBoeWRyb3Bob2JpY2l0eSBjaGFuZ2UiKSsgZ2VvbV9wb2ludChkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJEIiksIGFlcyh4PWZhY3Rvcihwb3NpdGlvbiksIHk9c2NvcmUpLCBhbHBoYSA9IDAuODUsIHBvc2l0aW9uPWppdHRlcjIpICsgc2NhbGVfY29sb3JfZGlzdGlsbGVyKHBhbGV0dGUgPSAiU3BlY3RyYWwiKSArIHRoZW1lX2J3KCkKCnBsb3QocHRlbl9hX3NwcmVhZDEpCnBsb3QocHRlbl9hX2FhKQpwbG90KHB0ZW5fcl9zcHJlYWQxKQpwbG90KHB0ZW5fcl9hYSkKcGxvdChwdGVuX25fc3ByZWFkMSkKcGxvdChwdGVuX25faHlkcm9kaWZmKQpwbG90KHB0ZW5fbl9hYSkKcGxvdChwdGVuX2Rfc3ByZWFkMSkKcGxvdChwdGVuX2RfaHlkcm9kaWZmKQpwbG90KHB0ZW5fZF9hYSkKCmBgYApgYGB7cn0KZ2dwbG90KHB0ZW4xX3Byb2Nfd3QsIGFlcyh5PXNjb3JlLCB4PWZhY3Rvcihwb3NpdGlvbiksIGNvbG91ciA9IGVuZCkpICsgZ2VvbV92aW9saW4oZHJhd19xdWFudGlsZXM9YygwLjUpLCBkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJQIiksIGFlcyhncm91cD1mYWN0b3IocG9zaXRpb24pKSwgc2NhbGUgPSAid2lkdGgiKSArIHhsYWIoIlBvc2l0aW9uIGluIFBURU4iKSArIGdndGl0bGUoIlByb2xpbmUgdmFyaWFudCBhYnVuZGFuY2Ugc2NvcmVzIikrIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiUCIpLCBhZXMoeD1mYWN0b3IocG9zaXRpb24pLCB5PXNjb3JlKSwgYWxwaGEgPSAwLjg1LCBwb3NpdGlvbj1qaXR0ZXIyKSArIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9dHdlbnR5X2NvbG9yKSArIHRoZW1lX2J3KCkKZ2dwbG90KHB0ZW4xX3Byb2Nfd3QsIGFlcyh5PXNjb3JlLCB4PWVuZCwgY29sb3VyID0gZW5kKSkgKyBnZW9tX3Zpb2xpbihkcmF3X3F1YW50aWxlcz1jKDAuNSksIGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHN0YXJ0PT0gIlAiKSwgYWVzKGdyb3VwPWVuZCksIHNjYWxlID0gIndpZHRoIikgKyB4bGFiKCJBbWlubyBhY2lkIikgKyBnZ3RpdGxlKCJQcm9saW5lIHZhcmlhbnQgYWJ1bmRhbmNlIHNjb3JlcyIpKyBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHN0YXJ0PT0gIlAiKSwgYWVzKHg9ZW5kLCB5PXNjb3JlKSwgYWxwaGEgPSAwLjc1LCBwb3NpdGlvbj1qaXR0ZXIxKSArIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9dHdlbnR5X2NvbG9yKSArIHRoZW1lX2J3KCkKZ2dwbG90KHB0ZW4xX3Byb2Nfd3QsIGFlcyh5PXNjb3JlLCB4PWZhY3Rvcihwb3NpdGlvbiksIGNvbG91ciA9IChoeWRybzItaHlkcm8xKSkpICsgZ2VvbV92aW9saW4oZHJhd19xdWFudGlsZXM9YygwLjUpLCBkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJQIiksIGFlcyhncm91cD1mYWN0b3IocG9zaXRpb24pKSwgc2NhbGUgPSAid2lkdGgiKSArIHhsYWIoIlBvc2l0aW9uIGluIFBURU4iKSArIGdndGl0bGUoIlByb2xpbmUgdmFyaWFudCBhYnVuZGFuY2Ugc2NvcmVzIHcvIGh5ZHJvcGhvYmljaXR5IGNoYW5nZSIpKyBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHN0YXJ0PT0gIlAiKSwgYWVzKHg9ZmFjdG9yKHBvc2l0aW9uKSwgeT1zY29yZSksIGFscGhhID0gMC44NSwgcG9zaXRpb249aml0dGVyMikgKyBzY2FsZV9jb2xvcl9kaXN0aWxsZXIocGFsZXR0ZSA9ICJTcGVjdHJhbCIpICsgdGhlbWVfYncoKQpgYGAKYGBge3J9CmdncGxvdChwdGVuMV9wcm9jX3d0LCBhZXMoeT1zY29yZSwgeD1mYWN0b3IocG9zaXRpb24pLCBjb2xvdXIgPSBlbmQpKSArIGdlb21fdmlvbGluKGRyYXdfcXVhbnRpbGVzPWMoMC41KSwgZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiVCIpLCBhZXMoZ3JvdXA9ZmFjdG9yKHBvc2l0aW9uKSksIHNjYWxlID0gIndpZHRoIikgKyB4bGFiKCJQb3NpdGlvbiBpbiBQVEVOIikgKyBnZ3RpdGxlKCJUIHZhcmlhbnQgYWJ1bmRhbmNlIHNjb3JlcyIpKyBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHN0YXJ0PT0gIlQiKSwgYWVzKHg9ZmFjdG9yKHBvc2l0aW9uKSwgeT1zY29yZSksIGFscGhhID0gMC44NSwgcG9zaXRpb249aml0dGVyMikgKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPXR3ZW50eV9jb2xvcikgKyB0aGVtZV9idygpCmdncGxvdChwdGVuMV9wcm9jX3d0LCBhZXMoeT1zY29yZSwgeD1lbmQsIGNvbG91ciA9IGVuZCkpICsgZ2VvbV92aW9saW4oZHJhd19xdWFudGlsZXM9YygwLjUpLCBkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJUIiksIGFlcyhncm91cD1lbmQpLCBzY2FsZSA9ICJ3aWR0aCIpICsgeGxhYigiQW1pbm8gYWNpZCIpICsgZ2d0aXRsZSgiVCB2YXJpYW50IGFidW5kYW5jZSBzY29yZXMiKSsgZ2VvbV9wb2ludChkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJUIiksIGFlcyh4PWVuZCwgeT1zY29yZSksIGFscGhhID0gMC43NSwgcG9zaXRpb249aml0dGVyMSkgKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPXR3ZW50eV9jb2xvcikgKyB0aGVtZV9idygpCmdncGxvdChwdGVuMV9wcm9jX3d0LCBhZXMoeT1zY29yZSwgeD1mYWN0b3IocG9zaXRpb24pLCBjb2xvdXIgPSAoaHlkcm8yLWh5ZHJvMSkpKSArIGdlb21fdmlvbGluKGRyYXdfcXVhbnRpbGVzPWMoMC41KSwgZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiVCIpLCBhZXMoZ3JvdXA9ZmFjdG9yKHBvc2l0aW9uKSksIHNjYWxlID0gIndpZHRoIikgKyB4bGFiKCJQb3NpdGlvbiBpbiBQVEVOIikgKyBnZ3RpdGxlKCJUIHZhcmlhbnQgYWJ1bmRhbmNlIHNjb3JlcyB3LyBoeWRyb3Bob2JpY2l0eSBjaGFuZ2UiKSsgZ2VvbV9wb2ludChkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJUIiksIGFlcyh4PWZhY3Rvcihwb3NpdGlvbiksIHk9c2NvcmUpLCBhbHBoYSA9IDAuODUsIHBvc2l0aW9uPWppdHRlcjIpICsgc2NhbGVfY29sb3JfZGlzdGlsbGVyKHBhbGV0dGUgPSAiU3BlY3RyYWwiKSArIHRoZW1lX2J3KCkKCmBgYAoKCmBgYHtyfQojaW4gb3JkZXIgdG8gZmluZCBwb3NpdGlvbiB3aXRoIGxvdyBzdGRkZXYgKGV4Y2x1ZGluZyBub25zZW5zZSkKcHRlbl92YXJpYW5jZSA8LSBzdW1tYXJ5U0UoKHN1YnNldChwdGVuMV9kYXRhLCBlbmQgIT0gIlgiKSksIG1lYXN1cmV2YXI9InNjb3JlIiwgZ3JvdXB2YXJzPSJwb3NpdGlvbiIsIG5hLnJtPVRSVUUpCgojYWRqdXN0IE4gKG1pbmltdW0gIyB2YXJpYW50cyBhdCBhIHBvc2l0aW9uKSBhbmQgc3RkZGV2CiM1LCAwLjExCiMxMCwgMC4xNQpwdGVuX3ZhcmlhbmNlX2ZpbHRlcmVkIDwtIHN1YnNldChzdWJzZXQocHRlbl92YXJpYW5jZSwgTiA+IDggKSwgc2QgPCAwLjExKQpwdGVuX3ZhcmlhbmNlX2ZpbHRlcmVkJHBvc2l0aW9uCgoKI25vbnNlbnNlIHZhcmlhbnQgc2NvcmVzIGFyZSBncmFwaGVkIGFzIGRvdHMsIGJ1dCBhcmUgbm90IGluY2x1ZGVkIGluIHRoZSBvdmVybGF5aW5nIHZpb2xpbiBwbG90cwpnZ3Bsb3Qobm9fbm9uc2Vuc2UsIGFlcyh5PXNjb3JlLCB4PWZhY3Rvcihwb3NpdGlvbiksIGNvbG91ciA9IGVuZCkpICsgCiAgZ2VvbV92aW9saW4oZHJhd19xdWFudGlsZXM9YygwLjUpLCBkYXRhPXN1YnNldChub19ub25zZW5zZSwgbm9fbm9uc2Vuc2UkcG9zaXRpb24gJWluJSBwdGVuX3ZhcmlhbmNlX2ZpbHRlcmVkJHBvc2l0aW9uKSwgYWVzKGdyb3VwPWZhY3Rvcihwb3NpdGlvbikpLCBzY2FsZSA9ICJ3aWR0aCIpICsgCiAgeGxhYigiUG9zaXRpb24gaW4gUFRFTiIpICsgZ2d0aXRsZSgiSW50b2xlcmFudCBhbmQgdG9sZXJhbnQgYW1pbm8gYWNpZCBwb3NpdGlvbnMiKSArCiAgZ2VvbV9wb2ludChkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBwdGVuMV9wcm9jX3d0JHBvc2l0aW9uICVpbiUgcHRlbl92YXJpYW5jZV9maWx0ZXJlZCRwb3NpdGlvbiksIGFlcyh4PWZhY3Rvcihwb3NpdGlvbiksIHk9c2NvcmUpLCBhbHBoYSA9IDAuODUsIHBvc2l0aW9uPWppdHRlcjEpICsgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz10d2VudHlfY29sb3IpICsgdGhlbWVfYncoKQoKZ2dwbG90KG5vX25vbnNlbnNlLCBhZXMoeT1zY29yZSwgeD1wb3NpdGlvbiwgY29sb3VyID0gZW5kKSkgKyAKICBnZW9tX3Zpb2xpbihkcmF3X3F1YW50aWxlcz1jKDAuNSksIGRhdGE9c3Vic2V0KG5vX25vbnNlbnNlLCBub19ub25zZW5zZSRwb3NpdGlvbiAlaW4lIHB0ZW5fdmFyaWFuY2VfZmlsdGVyZWQkcG9zaXRpb24pLCBhZXMoZ3JvdXA9cG9zaXRpb24lJTQ1MCksIHNjYWxlID0gIndpZHRoIikgKyAKICB4bGFiKCJQb3NpdGlvbiBpbiBQVEVOIikgKyBnZ3RpdGxlKCJJbnRvbGVyYW50IGFuZCB0b2xlcmFudCBhbWlubyBhY2lkIHBvc2l0aW9ucyIpICsKICBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHB0ZW4xX3Byb2Nfd3QkcG9zaXRpb24gJWluJSBwdGVuX3ZhcmlhbmNlX2ZpbHRlcmVkJHBvc2l0aW9uKSwgYWVzKHg9cG9zaXRpb24sIHk9c2NvcmUpLCBhbHBoYSA9IDAuODUsIHBvc2l0aW9uPWppdHRlcjEpICsgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz10d2VudHlfY29sb3IpICsgdGhlbWVfYncoKQoKYGBgCmBgYHtyfQojZGlmZiBwYXJhbWV0ZXIgCnB0ZW5fdmFyaWFuY2VfZmlsdGVyZWQxIDwtIHN1YnNldChzdWJzZXQocHRlbl92YXJpYW5jZSwgTiA+IDEwKSwgc2QgPiAwLjI1KQoKI25vbnNlbnNlIHZhcmlhbnQgc2NvcmVzIGFyZSBncmFwaGVkIGFzIGRvdHMsIGJ1dCBhcmUgbm90IGluY2x1ZGVkIGluIHRoZSBvdmVybGF5aW5nIHZpb2xpbiBwbG90cwpnZ3Bsb3Qobm9fbm9uc2Vuc2UsIGFlcyh5PXNjb3JlLCB4PWZhY3Rvcihwb3NpdGlvbiksIGNvbG91ciA9IGVuZCkpICsgCiAgZ2VvbV92aW9saW4oZHJhd19xdWFudGlsZXM9YygwLjUpLCBkYXRhPXN1YnNldChub19ub25zZW5zZSwgbm9fbm9uc2Vuc2UkcG9zaXRpb24gJWluJSBwdGVuX3ZhcmlhbmNlX2ZpbHRlcmVkMSRwb3NpdGlvbiksIGFlcyhncm91cD1mYWN0b3IocG9zaXRpb24pKSwgc2NhbGUgPSAid2lkdGgiKSArIAogIHhsYWIoIlBvc2l0aW9uIGluIFBURU4iKSArIGdndGl0bGUoIkludG9sZXJhbnQgYW5kIHRvbGVyYW50IGFtaW5vIGFjaWQgcG9zaXRpb25zIikgKwogIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgcHRlbjFfcHJvY193dCRwb3NpdGlvbiAlaW4lIHB0ZW5fdmFyaWFuY2VfZmlsdGVyZWQxJHBvc2l0aW9uKSwgYWVzKHg9ZmFjdG9yKHBvc2l0aW9uKSwgeT1zY29yZSksIGFscGhhID0gMC44NSwgcG9zaXRpb249aml0dGVyMSkgKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPXR3ZW50eV9jb2xvcikgKyB0aGVtZV9idygpCgpnZ3Bsb3Qobm9fbm9uc2Vuc2UsIGFlcyh5PXNjb3JlLCB4PXBvc2l0aW9uLCBjb2xvdXIgPSBlbmQpKSArIAogIGdlb21fdmlvbGluKGRyYXdfcXVhbnRpbGVzPWMoMC41KSwgZGF0YT1zdWJzZXQobm9fbm9uc2Vuc2UsIG5vX25vbnNlbnNlJHBvc2l0aW9uICVpbiUgcHRlbl92YXJpYW5jZV9maWx0ZXJlZDEkcG9zaXRpb24pLCBhZXMoZ3JvdXA9cG9zaXRpb24lJTQ1MCksIHNjYWxlID0gIndpZHRoIikgKyAKICB4bGFiKCJQb3NpdGlvbiBpbiBQVEVOIikgKyBnZ3RpdGxlKCJJbnRvbGVyYW50IGFuZCB0b2xlcmFudCBhbWlubyBhY2lkIHBvc2l0aW9ucyIpICsKICBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHB0ZW4xX3Byb2Nfd3QkcG9zaXRpb24gJWluJSBwdGVuX3ZhcmlhbmNlX2ZpbHRlcmVkMSRwb3NpdGlvbiksIGFlcyh4PXBvc2l0aW9uLCB5PXNjb3JlKSwgYWxwaGEgPSAwLjg1LCBwb3NpdGlvbj1qaXR0ZXIxKSArIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9dHdlbnR5X2NvbG9yKSArIHRoZW1lX2J3KCkKCgoKY2hvc2VuIDwtIGMoNjEsIDY4LCAxMDUsIDEwOCwgMTIzLCAxMjcsIDEzMCwgMTMyLCAxMzUsIDE1NSwgMTY1LCAxNzMsIDE3NCwgMjQ2LCAzMjMsIDMzNSkKCmdncGxvdChwdGVuMV9wcm9jX3d0LCBhZXMoeT1zY29yZSwgeD1mYWN0b3IocG9zaXRpb24pLCBjb2xvdXIgPSBlbmQpKSArIAogIGdlb21fdmlvbGluKGRyYXdfcXVhbnRpbGVzPWMoMC41KSwgZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgcHRlbjFfcHJvY193dCRwb3NpdGlvbiAlaW4lIGNob3NlbiksIGFlcyhncm91cD1mYWN0b3IocG9zaXRpb24pKSwgc2NhbGUgPSAid2lkdGgiKSArIAogIHhsYWIoIlBvc2l0aW9uIGluIFBURU4iKSArIGdndGl0bGUoIkNsaW52YXIgcGF0aC9saWtlbHkgcGF0aCB2YXJpYW50IHBvc2l0aW9ucyIpICsKICBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHB0ZW4xX3Byb2Nfd3QkcG9zaXRpb24gJWluJSBjaG9zZW4pLCBhZXMoeD1mYWN0b3IocG9zaXRpb24pLCB5PXNjb3JlKSwgYWxwaGEgPSAwLjg1LCBwb3NpdGlvbj1qaXR0ZXIxKSArIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9dHdlbnR5X2NvbG9yKSArIHRoZW1lX2J3KCkKCmBgYApgYGB7cn0KI3B0ZW5fcG9zX21lYW4gPC0gZ2dwbG90KHB0ZW5fc3VtLCBhZXMoeD1wb3NpdGlvbiwgeT1zY29yZSkpKyBnZW9tX2Jhcihwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgpLCBzdGF0PSJpZGVudGl0eSIsIGNvbG91cj0iIzk5OTk5OSIpICsgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1zY29yZS1zZCwgeW1heCA9IHNjb3JlK3NkKSwgd2lkdGg9MSwgc2l6ZT0wLjMsIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKCkpICt5bGFiKCJWQU1QLXNlcSBzY29yZSIpK3RoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwgYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCkpICsgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCA0MDMsIDIwKSwgZXhwYW5kID0gYygwLDApKSArIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCkpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTE4NSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0uMSkgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MzUwLCBjb2xvcj0iYmxhY2siLCBzaXplPS4xKQoKI3ByZXR0eSB0cmFzaHkKZ2dwbG90KG5vX25vbnNlbnNlLCBhZXMoeT1zY29yZSwgeD1wb3NpdGlvbikpICsgCiAgZ2VvbV9iYXIoZGF0YT1zdWJzZXQobm9fbm9uc2Vuc2UxLCBub19ub25zZW5zZSRwb3NpdGlvbiAlaW4lIHB0ZW5fdmFyaWFuY2VfZmlsdGVyZWQxJHBvc2l0aW9uKSwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoKSwgc3RhdD0iaWRlbnRpdHkiLCBjb2xvdXI9IiM5OTk5OTkiKSArCiAgZ2VvbV9lcnJvcmJhcihkYXRhPXN1YnNldChub19ub25zZW5zZTEsIG5vX25vbnNlbnNlJHBvc2l0aW9uICVpbiUgcHRlbl92YXJpYW5jZV9maWx0ZXJlZDEkcG9zaXRpb24pLCBhZXMoeW1pbj1zY29yZS1zZCwgeW1heD1zY29yZStzZCksIHdpZHRoPTEsIHNpemU9MC4zLCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgpKSArCiAgI2dlb21fdmlvbGluKGRyYXdfcXVhbnRpbGVzPWMoMC41KSwgZGF0YT1zdWJzZXQobm9fbm9uc2Vuc2UxLCBub19ub25zZW5zZTEkcG9zaXRpb24gJWluJSBwdGVuX3ZhcmlhbmNlX2ZpbHRlcmVkMSRwb3NpdGlvbiksIGFlcyhncm91cD1wb3NpdGlvbiUlNDUwKSwgc2NhbGUgPSAid2lkdGgiKSArIAogIHhsYWIoIlBvc2l0aW9uIGluIFBURU4iKSArIGdndGl0bGUoIkludG9sZXJhbnQgYW5kIHRvbGVyYW50IGFtaW5vIGFjaWQgcG9zaXRpb25zIikgKwogICNnZW9tX3BvaW50KGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHB0ZW4xX3Byb2Nfd3QkcG9zaXRpb24gJWluJSBwdGVuX3ZhcmlhbmNlX2ZpbHRlcmVkMSRwb3NpdGlvbiksIGFlcyh4PXBvc2l0aW9uLCB5PXNjb3JlKSwgYWxwaGEgPSAwLjg1LCBwb3NpdGlvbj1qaXR0ZXIxKSArCiAgI3NjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9dHdlbnR5X2NvbG9yKSArIAogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgNDAzLCAyMCksIGV4cGFuZCA9IGMoMCwwKSkgKyBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApKSt0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksIGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLCBsZWdlbmQucG9zaXRpb249Im5vbmUiKQoKcHRlbl92YXJpYW5jZV9maWx0ZXJlZDIgPC0gc3Vic2V0KHN1YnNldChwdGVuX3ZhcmlhbmNlLCBOID4gMTApLCBzZCA+IDAuMzUpCgpnZ3Bsb3Qobm9fbm9uc2Vuc2UsIGFlcyh5PXNkLCB4PXBvc2l0aW9uKSkgKwogIGdlb21fYmFyKGRhdGE9c3Vic2V0KG5vX25vbnNlbnNlLCBub19ub25zZW5zZSRwb3NpdGlvbiAlaW4lIHB0ZW5fdmFyaWFuY2VfZmlsdGVyZWQkcG9zaXRpb24pLCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgpLCBzdGF0PSJpZGVudGl0eSIsIGNvbG91cj0iIzk5OTk5OSIpCgoKI2FsbCBzZCBvdmVyIC4yNSwgTj4xMApnZ3Bsb3QocHRlbl9zdW0sIGFlcyh5PXNkLCB4PXBvc2l0aW9uKSkgKwogIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQocHRlbl9zdW0sIHB0ZW5fc3VtJHBvc2l0aW9uICVpbiUgcHRlbl92YXJpYW5jZV9maWx0ZXJlZDEkcG9zaXRpb24pKSArCiAgI2dlb21fZXJyb3JiYXIoZGF0YT1zdWJzZXQobm9fbm9uc2Vuc2UsIG5vX25vbnNlbnNlJHBvc2l0aW9uICVpbiUgcHRlbl92YXJpYW5jZV9maWx0ZXJlZDIkcG9zaXRpb24pLCBhZXMoeW1pbj1zY29yZS1zZCwgeW1heCA9IHNjb3JlK3NkKSwgd2lkdGg9MSwgc2l6ZT0wLjMsIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKCkpICsgCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCA0MDMsIDIwKSwgZXhwYW5kID0gYygwLDApKSArIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCkpK3RoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwgYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCgoKI3RoaXMgaXMgaG93IF8gaXMgZGVmaW5lZDogcHRlbl92YXJpYW5jZSA8LSBzdW1tYXJ5U0UoKHN1YnNldChwdGVuMV9kYXRhLCBlbmQgIT0gIlgiKSksIG1lYXN1cmV2YXI9InNjb3JlIiwgZ3JvdXB2YXJzPSJwb3NpdGlvbiIsIG5hLnJtPVRSVUUpCnB0ZW5fdmFyaWFuY2VfZmlsdGVyZWQ0IDwtc3Vic2V0KHB0ZW5fdmFyaWFuY2UsIE4+NSkKdmFyaWFuY2VfYmFyIDwtIGdncGxvdChwdGVuX3ZhcmlhbmNlX2ZpbHRlcmVkNCwgYWVzKHk9c2QsIHg9cG9zaXRpb24pKSArCiAgZ2VvbV9zZWdtZW50KGFlcyh4PXBvc2l0aW9uLCB4ZW5kPXBvc2l0aW9uLCB5PTAsIHllbmQ9c2QpLCBjb2xvcj0iZ3JleTY4IikgKwogIGdlb21fcG9pbnQoc2l6ZT0wLjUpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDQwMywgMjApLCBleHBhbmQgPSBjKDAsMCkpICsgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSkrdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLCBheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwgbGVnZW5kLnBvc2l0aW9uPSJub25lIikKcGxvdCh2YXJpYW5jZV9iYXIpCgoKI2FsbCBzZApnZ3Bsb3QocHRlbl9zdW0sIGFlcyh5PXNkLCB4PXBvc2l0aW9uKSkgKwogIGdlb21fc2VnbWVudChhZXMoeD1wb3NpdGlvbiwgeGVuZD1wb3NpdGlvbiwgeT0wLCB5ZW5kPXNkKSwgY29sb3I9ImdyZXk0OCIpICsKICAjZ2VvbV9wb2ludCgpICsKICAjZ2VvbV9lcnJvcmJhcihkYXRhPXN1YnNldChub19ub25zZW5zZSwgbm9fbm9uc2Vuc2UkcG9zaXRpb24gJWluJSBwdGVuX3ZhcmlhbmNlX2ZpbHRlcmVkMiRwb3NpdGlvbiksIGFlcyh5bWluPXNjb3JlLXNkLCB5bWF4ID0gc2NvcmUrc2QpLCB3aWR0aD0xLCBzaXplPTAuMywgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoKSkgKyAKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDQwMywgMjApLCBleHBhbmQgPSBjKDAsMCkpICsgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSkrdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLCBheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwgbGVnZW5kLnBvc2l0aW9uPSJub25lIikKICAKYGBgCmBgYHtyfQojaSdtIHNvIHRpcmVkCnB0ZW5fc3VtX2ZpbHQgPC0gcHRlbl9zdW0KcHRlbl9zdW1fZmlsdCRzZDIgPSBwdGVuX3ZhcmlhbmNlX2ZpbHRlcmVkNFttYXRjaChwdGVuX3N1bV9maWx0JHBvc2l0aW9uLCBwdGVuX3ZhcmlhbmNlX2ZpbHRlcmVkNCRwb3NpdGlvbiksICJzZCJdCnB0ZW5fcG9zX2NvbG9yZWRfbWVhbiA8LSBnZ3Bsb3QocHRlbl9zdW1fZmlsdCwgYWVzKHg9cG9zaXRpb24sIHk9c2NvcmUpKSsgZ2VvbV9iYXIocG9zaXRpb249cG9zaXRpb25fZG9kZ2UoKSwgc3RhdD0iaWRlbnRpdHkiLCBjb2xvdXI9cHRlbl9zdW1fZmlsdCRzZDIpICsgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1zY29yZS1zZCwgeW1heCA9IHNjb3JlK3NkKSwgd2lkdGg9MSwgc2l6ZT0wLjMsIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKCkpICt5bGFiKCJWQU1QLXNlcSBzY29yZSIpK3RoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwgYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCkpICsgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCA0MDMsIDIwKSwgZXhwYW5kID0gYygwLDApKSArIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCkpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTE4NSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0uMSkgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MzUwLCBjb2xvcj0iYmxhY2siLCBzaXplPS4xKSsgc2NhbGVfY29sb3VyX2dyYWRpZW50KGxvdyA9ICJ3aGl0ZSIsIGhpZ2ggPSAiYmx1ZSIpCnBsb3QocHRlbl9wb3NfY29sb3JlZF9tZWFuKQpgYGAKCgpgYGB7cn0KI21ldGhvZDIgKHVzZSBmb3IgZmluYWwgbGF5b3V0LCBzaXplIHNwZWNpZmljYXRpb24sIGRvd25sb2FkKQpnZD1nZ3Bsb3RfZ3RhYmxlKGdncGxvdF9idWlsZCh2YXJpYW5jZV9iYXIpKQptYXhXaWR0aCA9IGdyaWQ6OnVuaXQucG1heChnYSR3aWR0aHMsIGdiJHdpZHRocywgZ2Mkd2lkdGhzLCBnZCR3aWR0aHMpCmdhJHdpZHRocyA8LSBhcy5saXN0KG1heFdpZHRoKQpnYiR3aWR0aHMgPC0gYXMubGlzdChtYXhXaWR0aCkKZ2Mkd2lkdGhzIDwtIGFzLmxpc3QobWF4V2lkdGgpCmdkJHdpZHRocyA8LSBhcy5saXN0KG1heFdpZHRoKQpncmlkLm5ld3BhZ2UoKQoKI3N0b3JpbmcsIHdpdGggc3BlY2lmaWVkIHdpZHRocyEhCnBkZigncHRlbl90cG10X21lYW5faGVhdF92YXJpYW5jZS5wZGYnLCB3aWR0aD04LCBoZWlnaHQ9NikKI2dyaWQuYXJyYW5nZShhcnJhbmdlR3JvYihnQyxnQSxnQixucm93PTMsaGVpZ2h0cz1jKC4xLC4zLC44KSkpCmdyaWQuYXJyYW5nZShhcnJhbmdlR3JvYihnYyxnZCxnYSxnYixucm93PTQsaGVpZ2h0cz1jKC4xLC4xNSwuMTUsLjYpKSkKZGV2Lm9mZigpCmBgYAoKCmBgYHtyIGluY2x1ZGU9RkFMU0V9CiNvbiBob2xkLCBjcmVhdGlvbiBvZiBhbWlubyBhY2lkIGRhdGFmcmFtZSB0byBwbG90IGFidW5kYW5jZSBzY29yZXMgYWdhaW5zdApuYW1lIDwtIGMoJ0FsYScsICdBcmcnLCAnQXNuJywgJ0FzcCcsICdDeXMnLCAnR2x1JywgJ0dsbicsICdHbHknLCAnSGlzJywgJ0lsZScsICdMZXUnLCAnTHlzJywgJ01ldCcsICdQaGUnLCAnUHJvJywgJ1NlcicsICdUaHInLCAnVHJwJywgJ1R5cicsICdWYWwnKQpxdWFsaXR5IDwtIGMoJ0h5ZHJvcGhvYmljJywgJ0Jhc2ljJywgJ1BvbGFyIE5ldXRyYWwnLCAnQWNpZGljJywgJ1BvbGFyIE5ldXRyYWwnLCAnQWNpZGljJywgJ1BvbGFyIE5ldXRyYWwnLCAnR2x5Y2luZScsICdCYXNpYycsICdIeWRyb3Bob2JpYycsICdIeWRyb3Bob2JpYycsICdCYXNpYycsICdIeWRyb3Bob2JpYycsICdIeWRyb3Bob2JpYycsICdIeWRyb3Bob2JpYycsICdQb2xhciBOZXV0cmFsJywgJ1BvbGFyIE5ldXRyYWwnLCAnSHlkcm9waG9iaWMnLCAnSHlkcm9waG9iaWMnLCAnSHlkcm9waG9iaWMnKQojYWJ1bmRhbmNlIDwtIGdldCBiZXR0ZXIgc2NhbGUKYWJ1bmRhbmNlIDwtIGMoMC4wODg0LCAwLjA1NywgMC4wNDE3LCAwLjA1MzksIDAuMDEyNCwgMC4wNjI0LCAwLjAzODIsIDAuMDcwMywgMC4wMjIwLCAwLjA1OTUsIDAuMDk5NCwgMC4wNTI3LCAwLjAyMzcsIDAuMDQsIDAuMDQ3MSwgMC4wNjcyLCAwLjA1NDMsIDAuMDEyMSwgMC4wMywgMC4wNjc3KQojaXNvZWxlY3RyaWMgcG9pbnQgPC0gdW5rbm93biBzb3VyY2UgKG5jYmkpCmlzb2VsZWN0cmljIDwtIGMoNiwgMTAuOCwgNS40LCAzLCA1LCAzLjIsIDUuNywgNiwgNy42LCA2LCA2LCA5LjcsIDUuNywgNS41LCA2LjMsIDUuNywgNS42LCA1LjksIDUuNywgNi4wKQpocF9rX2QgPC0gYygxLjgsIC00LjUsIC0zLjUsIC0zLjUsIDIuNSwgLTMuNSwgLTMuNSwgLTAuNCwgLTMuMiwgNC41LCAzLjgsIC0zLjksIDEuOSwgMi44LCAtMS42LCAtMC44LCAtMC43LCAtMC45LCAtMS4zLCA0LjIpCmhwX2phbmluIDwtYygwLjMsIC0xLjQsIC0wLjUsIC0wLjYsIDAuOSwgLTAuNywgLTAuNywgMC4zLCAtMC4xLCAwLjcsIDAuNSwgLTEuOCwgMC40LCAwLjUsIC0wLjMsIC0wLjEsIC0wLjIsIDAuMywgLTAuNCwgMC42KQojTW9uZXJhIGV0IGFsLiwgSi4gUHJvdGVpbiBTY2kgKHBybyAoLTQ2KSBtYXkgYmUgc2tldGNoKQpocF9waDcgPC0gYyg0MSwgLTE0LCAtMjgsIC01NSwgNDksIC0zMSwgLTEwLCAwLCA4LCA5OSwgOTcsIC0yMywgNzQsIDEwMCwgLTQ2LCAtNSwgMTMsIDk3LCA2MywgNzYpCmhfYm9uZHMgPC0gYygwLCA3LCA1LCA0LCAwLCA0LCA1LCAwLCAzLCAwLCAwLCAzLCAwLCAwLCAwLCAzLCAzLCAxLCAzLCAwKQptb2xfd2VpZ2h0IDwtYyg3MSwgMTU2LCAxMTQsIDExNSwgMTAzLCAxMjksIDEyOCwgNTcsIDEzNywgMTEzLCAxMTMsIDEyOCwgMTMxLCAxNDcsIDk3LCA4NywgMTAxLCAxODYsIDE2MywgOTkpCgphbWlub19hY2lkcy5kYXRhIDwtIGRhdGEuZnJhbWUobmFtZSwgcXVhbGl0eSwgYWJ1bmRhbmNlLCBpc29lbGVjdHJpYywgaHBfa19kLCBocF9qYW5pbiwgaHBfcGg3LCBoX2JvbmRzLCBtb2xfd2VpZ2h0KQoKYGBgCgpgYGB7cn0KI0lkZW50aWZ5aW5nIGl0ZW1zIGluIHRhaWwgdG8gaW52ZXN0aWdhdGUKcHRlbjFfbm9uc2Vuc2UgPC0gc3Vic2V0KHB0ZW4xX3Byb2MsIGNsYXNzID09ICJub25zZW5zZSIpCnRwbXQxX25vbnNlbnNlIDwtIHN1YnNldCh0cG10MV9wcm9jLCBjbGFzcyA9PSAibm9uc2Vuc2UiKQpwdGVuMV9zeW5vbiA8LSBzdWJzZXQocHRlbjFfcHJvYywgY2xhc3MgPT0gInN5bm9ueW1vdXMiKQp0cG10MV9zeW5vbiA8LSBzdWJzZXQodHBtdDFfcHJvYywgY2xhc3MgPT0gInN5bm9ueW1vdXMiKQoKcHRlbjFfbm9fbWlzc2Vuc2UgPC0gc3Vic2V0KHB0ZW4xX3Byb2MsIGNsYXNzID09ICJzeW5vbnltb3VzIiB8IGNsYXNzID09ICJub25zZW5zZSIpCgpnZ3Bsb3QocHRlbjFfbm9uc2Vuc2UsIGFlcyh4PXNjb3JlKSkgKyBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aD0uMDEsIGNvbG91cj0iYmx1ZSIsIGZpbGw9IndoaXRlIikgKyB0aGVtZV9idygpCiMrIGdlb21fZGVuc2l0eSgpCmdncGxvdChwdGVuMV9zeW5vbiwgYWVzKHg9c2NvcmUpKSArIGdlb21faGlzdG9ncmFtKGJpbndpZHRoPS4wMSwgY29sb3VyPSJyZWQiLCBmaWxsPSJ3aGl0ZSIpICsgdGhlbWVfYncoKQoKZ2dwbG90KHB0ZW4xX3Byb2Nfd3QsIGFlcyh4PXNjb3JlKSkgKyBnZW9tX2hpc3RvZ3JhbShkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LGNsYXNzID09ICJub25zZW5zZSIpLCBmaWxsID0gInJlZCIsIGFscGhhID0gMC41LCBiaW53aWR0aD0uMDEpICsgZ2VvbV9oaXN0b2dyYW0oZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCxjbGFzcyA9PSAic3lub255bW91cyIpLCBmaWxsID0gImJsdWUiLCBhbHBoYSA9IDAuNSwgYmlud2lkdGg9LjAxKSArIGdlb21faGlzdG9ncmFtKGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsY2xhc3MgPT0gIm1pc3NlbnNlIiksIGZpbGwgPSAiZ3JlZW4iLCBhbHBoYSA9IDAuMiwgYmlud2lkdGg9LjAxKSArIHRoZW1lX2J3KCkKCmdncGxvdChwdGVuMV9ub19taXNzZW5zZSwgYWVzKHg9c2NvcmUpKSArIGdlb21faGlzdG9ncmFtKGRhdGE9c3Vic2V0KHB0ZW4xX25vX21pc3NlbnNlLGNsYXNzID09ICJub25zZW5zZSIpLCBmaWxsID0gInJlZCIsIGFscGhhID0gMC41LCBiaW53aWR0aD0uMDEpICsgZ2VvbV9oaXN0b2dyYW0oZGF0YT1zdWJzZXQocHRlbjFfbm9fbWlzc2Vuc2UsY2xhc3MgPT0gInN5bm9ueW1vdXMiKSwgZmlsbCA9ICJibHVlIiwgYWxwaGEgPSAwLjUsIGJpbndpZHRoPS4wMSkgKyB0aGVtZV9idygpCgpnZ3Bsb3QodHBtdDFfc3lub24sIGFlcyh4PXNjb3JlKSkgKyBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aD0uMDEsIGNvbG91cj0icmVkIiwgZmlsbD0id2hpdGUiKSArIHRoZW1lX2J3KCkKZ2dwbG90KHRwbXQxX25vbnNlbnNlLCBhZXMoeD1zY29yZSkpICsgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGg9LjAxLCBjb2xvdXI9ImJsdWUiLCBmaWxsPSJ3aGl0ZSIpICsgdGhlbWVfYncoKQpgYGAKYGBge3J9CiMwLjU1Cm5vbnNlbnNlX3RhaWwgPC0gc3Vic2V0KHB0ZW4xX25vbnNlbnNlLCBzY29yZSA+IDAuNikKc3lub25fdGFpbCA8LSBzdWJzZXQocHRlbjFfc3lub24sIHNjb3JlIDwgMC42KQpub25zZW5zZV90YWlsJHNlY29uZGFyeV9zdHJ1Y3QgPC0gaWZlbHNlKGlzLm5hKG5vbnNlbnNlX3RhaWwkaGVsaXgpLCAidW5rbm93biIsCiAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShub25zZW5zZV90YWlsJGhlbGl4PT0xLCAiaGVsaXgiLAogICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uobm9uc2Vuc2VfdGFpbCRzaGVldD09MSwgInNoZWV0IiwKICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKG5vbnNlbnNlX3RhaWwkaGVsaXg9PTAsICJuZWl0aGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgInVua25vd24iKSkpKQpzeW5vbl90YWlsJHNlY29uZGFyeV9zdHJ1Y3QgPC0gaWZlbHNlKGlzLm5hKHN5bm9uX3RhaWwkaGVsaXgpLCAidW5rbm93biIsCiAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzeW5vbl90YWlsJGhlbGl4PT0xLCAiaGVsaXgiLAogICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3lub25fdGFpbCRzaGVldD09MSwgInNoZWV0IiwKICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN5bm9uX3RhaWwkaGVsaXg9PTAsICJuZWl0aGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgInVua25vd24iKSkpKQoKI2RhdGFbcm93LGNvbHVtbl0Kbl90YWlsIDwtIG5vbnNlbnNlX3RhaWxbLGMoMSwyLDcsMzAsMTI3KV0Kc190YWlsIDwtIHN5bm9uX3RhaWxbLGMoMSwyLDcsMzAsMTI3KV0Kbl90YWlsJGJwX3BvcyA8LSAobl90YWlsJHBvc2l0aW9uLTEpKjMKc190YWlsJGJwX3BvcyA8LSAoc190YWlsJHBvc2l0aW9uLTEpKjMKCm5fdGFpbApzX3RhaWwKYGBgCmBgYHtyfQojanVzdCBpbiBjYXNlIHRoZXJlIGlzIGEgZGlzY2VybmlibGUgcGF0dGVybgpzX3RhaWxfcG9zIDwtIGdncGxvdChzX3RhaWwsIGFlcyh4PXBvc2l0aW9uLCB5PXNjb3JlLCBjb2xvdXI9c2Vjb25kYXJ5X3N0cnVjdCkpKyBnZW9tX3BvaW50KHNpemU9LjMpICsgc2NhbGVfeF9jb250aW51b3VzKG1pbm9yX2JyZWFrcyA9IHNlcSgwLCA0MDUsIDUpKSArIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiI0ZGNDg0OCIsICIjMDBDODUzIiwgIiM1NzU3RkYiLCAiI0E5QTlBOSIpKSAreWxhYigiVkFNUC1zZXEgc2NvcmUiKSt4bGFiKCJQb3NpdGlvbiBpbiBQVEVOIikrbGFicyhjb2xvdXI9IlNlY29uZGFyeSBTdHJ1Y3R1cmUiKStnZ3RpdGxlKCJQVEVOIHN5bm9ueW1vdXMgdmFyaWFudCB0YWlsIHNjb3JlcyBpbiByZWxhdGlvbiB0byBwcm90ZWluIHN0cnVjdHVyZSIpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTQ3LCBjb2xvcj0iYmxhY2siLCBzaXplPS4xKSArIGdlb21fdmxpbmUoeGludGVyY2VwdD03OCwgY29sb3I9ImJsYWNrIiwgc2l6ZT0uMSkgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MTIyLjUsIGNvbG9yPSJibGFjayIsIHNpemU9LjEpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTE0MCwgY29sb3I9ImJsYWNrIiwgc2l6ZT0uMSkgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MTY1LCBjb2xvcj0iYmxhY2siLCBzaXplPS4xKSArIGdlb21fdmxpbmUoeGludGVyY2VwdD0xOTQsIGNvbG9yPSJibGFjayIsIHNpemU9LjEpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTIwOSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0uMSkgKyB0aGVtZV9idygpCnBsb3Qoc190YWlsX3BvcykKCiNoZWxwIHZpc3VhbGl6aW5nIE5NRCBydWxlcwpuX3RhaWxfcG9zIDwtIGdncGxvdChuX3RhaWwsIGFlcyh4PXBvc2l0aW9uLCB5PXNjb3JlLCBjb2xvdXI9c2Vjb25kYXJ5X3N0cnVjdCkpKyBnZW9tX3BvaW50KHNpemU9LjMpICsgc2NhbGVfeF9jb250aW51b3VzKG1pbm9yX2JyZWFrcyA9IHNlcSgwLCA0MDUsIDUpKSArIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiI0ZGNDg0OCIsICIjMDBDODUzIiwgIiM1NzU3RkYiLCAiI0E5QTlBOSIpKSAreWxhYigiVkFNUC1zZXEgc2NvcmUiKSt4bGFiKCJQb3NpdGlvbiBpbiBQVEVOIikrbGFicyhjb2xvdXI9IlNlY29uZGFyeSBTdHJ1Y3R1cmUiKStnZ3RpdGxlKCJQVEVOIG5vbnNlbnNlIHZhcmlhbnQgdGFpbCBzY29yZXMgaW4gcmVsYXRpb24gdG8gcHJvdGVpbiBzdHJ1Y3R1cmUiKSArIGdlb21fdmxpbmUoeGludGVyY2VwdD00NywgY29sb3I9ImJsYWNrIiwgc2l6ZT0uMSkgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9NzgsIGNvbG9yPSJibGFjayIsIHNpemU9LjEpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTEyMi41LCBjb2xvcj0iYmxhY2siLCBzaXplPS4xKSArIGdlb21fdmxpbmUoeGludGVyY2VwdD0xNDAsIGNvbG9yPSJibGFjayIsIHNpemU9LjEpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTE2NSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0uMSkgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MTk0LCBjb2xvcj0iYmxhY2siLCBzaXplPS4xKSArIGdlb21fdmxpbmUoeGludGVyY2VwdD0yMDksIGNvbG9yPSJibGFjayIsIHNpemU9LjEpICsgdGhlbWVfYncoKQpwbG90KG5fdGFpbF9wb3MpCmBgYAoKYGBge3IgaW5jbHVkZT1GQUxTRX0Kc190YWlsJHByb2JfQUdfR1QgPC0gYygwLCAxLzYsIDEvMiwgMCwgMS8yLCAxLzYpCnNfdGFpbCRwcm9iX3RpdHYgPC0gYygwLCAyLzMsIDIvMywgMCwgMi8zLCAxLzMpCmdncGxvdChuX3RhaWwsIGFlcyh4PXBvc2l0aW9uLHk9c2NvcmUpKSArIGdlb21fcG9pbnQoKSArIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpCmdncGxvdChzX3RhaWwsIGFlcyh4PXByb2JfdGl0dix5PXNjb3JlKSkgKyBnZW9tX3BvaW50KCkgKyBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iKQpnZ3Bsb3Qoc190YWlsLCBhZXMoeT1wcm9iX3RpdHYseD1zY29yZSkpICsgZ2VvbV9wb2ludCgpICsgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIikKcnNxIDwtIGZ1bmN0aW9uICh4LCB5KSBjb3IoeCwgeSleMgpuX3JzcSA8LSByc3Eobl90YWlsJHBvc2l0aW9uLCBzX3RhaWwkc2NvcmUpCnNfcnNxIDwtIHJzcShzX3RhaWwkcHJvYl90aXR2LCBzX3RhaWwkc2NvcmUpCm5fcnNxCnNfcnNxCiNubyByZWxhdGlvbnNoaXAuLi4KYGBgCgpgYGB7ciBpbmNsdWRlPUZBTFNFfQoKZ3NfbHMoKQp0cG10X3J1ZGRsZSA8LSBnc190aXRsZSgiVFBNVF9ydWRkbGUiKQp0cG10X3JlYWQgPC0gZ3NfcmVhZChzcz10cG10X3J1ZGRsZSwgd3MgPSAicnVkZGxlX3RwbXRfdmFyaWFudHMiKQp0cG10X3J1ZGRsZV9kYXRhIDwtIGFzLmRhdGEuZnJhbWUodHBtdF9yZWFkKQpgYGAKYGBge3IgZWNobz1GQUxTRX0KI3JldmVyc2luZyBkYXRhIHRvIGZpdCB0cG10MV9kYXRhCnJldmVyIDwtIGZ1bmN0aW9uKGRmPXRwbXRfcnVkZGxlX2RhdGEpe2RmPC1kZltkaW0oZGYpWzFdOjEsXX0KdHBtdF9ydWRkbGVfZGF0YV9yZXYgPSByZXZlcih0cG10X3J1ZGRsZV9kYXRhKQoKI2NyZWF0aW5nIHZhcmlhbnQgY29sdW1uLCBlcXVpdiB0byB0cG10MV9kYXRhJ3MKdHBtdF9ydWRkbGVfZGF0YV9yZXYkdmFyaWFudCA8LSBkby5jYWxsKHBhc3RlLCBjKHRwbXRfcnVkZGxlX2RhdGFfcmV2W2MoNSwyNCw2KV0sIHNlcD0iIikpCgojbWFraW5nIGJvdGggdGFibGVzIHNtYWxsZXIKdHBtdF9lc3NlbnRpYWwgPC0gdHBtdF9ydWRkbGVfZGF0YV9yZXZbLGMoMiwzLDQsNSw2LDE3LDE5LDI0LDI3LDI4LDI5LDMwLDMxLDMyLDMzLDM0LDM1LDc2LDc3LDc4LDEzNyldCnRwbXQxX3Byb2NfZXNzIDwtIHRwbXQxX3Byb2Nfd3RbLGMoMSwyLDMsNSw2LDcsMzAsMzIsODApXQoKI21lcmdpbmcgdGFibGVzIHdpdGggdmFyaWFudCBuYW1lCnRwbXRfbWVyZ2UgPC0gbWVyZ2UodHBtdDFfcHJvY19lc3MsIHRwbXRfZXNzZW50aWFsLCBieT0idmFyaWFudCIpCgojY29tcGFyaW5nIGFidW5kYW5jZSBzY29yZXMgd2l0aCB2YXJpb3VzIHNjb3JlcyBpbiBkYk5TRlAgKGNvbnRhaW5zIGFubm90YXRpb25zIG9mIGFsbCBwb3RlbnRpYWwgbm9uLXN5bm9ueW1vdXMgc2luZ2xlLW51Y2xlb3RpZGUgdmFyaWFudHMgKG5zU05WcykgaW4gdGhlIGh1bWFuIGdlbm9tZSkKdHBtdF9jb3IxIDwtIGdncGxvdCh0cG10X21lcmdlLCBhZXMoeD1zY29yZSwgeT1hcy5udW1lcmljKFNJRlRfc2NvcmUpKSkrIGdlb21fcG9pbnQoYWxwaGEgPSAwLjIpICsgeGxhYigiVkFNUC1zZXEgc2NvcmUiKSt5bGFiKCJTSUZUIHNjb3JlIikrZ2d0aXRsZSgiMSIpICsgdGhlbWVfYncoKQp0cG10X2NvcjEuNSA8LSBnZ3Bsb3QodHBtdF9tZXJnZSwgYWVzKHg9c2NvcmUsIHk9YXMubnVtZXJpYyhTSUZUX2NvbnZlcnRlZF9yYW5rc2NvcmUpKSkrIGdlb21fcG9pbnQoYWxwaGEgPSAwLjIpICsgeGxhYigiVkFNUC1zZXEgc2NvcmUiKSt5bGFiKCJTSUZUIGNvbnZlcnRlZCByYW5rc2NvcmUiKStnZ3RpdGxlKCIxLjUiKSArIHRoZW1lX2J3KCkKdHBtdF9jb3I1IDwtIGdncGxvdCh0cG10X21lcmdlLCBhZXMoeD1zY29yZSwgeT1DQUREX3Jhd19yYW5rc2NvcmUpKSsgZ2VvbV9wb2ludChhbHBoYSA9IDAuMikgKyB4bGFiKCJWQU1QLXNlcSBzY29yZSIpK3lsYWIoIkNBREQgcmF3IHJhbmtzY29yZSIpK2dndGl0bGUoIjUiKSArIHRoZW1lX2J3KCkKdHBtdF9jb3IyIDwtIGdncGxvdCh0cG10X21lcmdlLCBhZXMoeD1zY29yZSwgeT1hcy5udW1lcmljKFBvbHlwaGVuMl9IRElWX3Njb3JlKSkpKyBnZW9tX3BvaW50KGFscGhhID0gMC4yKSArIHhsYWIoIlZBTVAtc2VxIHNjb3JlIikreWxhYigiUG9seXBoZW4yIEhESVYgc2NvcmUiKStnZ3RpdGxlKCIyIikgKyB0aGVtZV9idygpCnRwbXRfY29yMyA8LSBnZ3Bsb3QodHBtdF9tZXJnZSwgYWVzKHg9c2NvcmUsIHk9YXMubnVtZXJpYyhQb2x5cGhlbjJfSFZBUl9zY29yZSkpKSsgZ2VvbV9wb2ludChhbHBoYSA9IDAuMikgKyB4bGFiKCJWQU1QLXNlcSBzY29yZSIpK3lsYWIoIlBvbHlwaGVuMiBIVkFSIHNjb3JlIikrZ2d0aXRsZSgiMyIpICsgdGhlbWVfYncoKQp0cG10X2NvcjIuNSA8LSBnZ3Bsb3QodHBtdF9tZXJnZSwgYWVzKHg9c2NvcmUsIHk9YXMubnVtZXJpYyhQb2x5cGhlbjJfSERJVl9yYW5rc2NvcmUpKSkrIGdlb21fcG9pbnQoYWxwaGEgPSAwLjIpICsgeGxhYigiVkFNUC1zZXEgc2NvcmUiKSt5bGFiKCJQb2x5cGhlbjIgSERJViByYW5rc2NvcmUiKStnZ3RpdGxlKCIyLjUiKSArIHRoZW1lX2J3KCkKdHBtdF9jb3IzLjUgPC0gZ2dwbG90KHRwbXRfbWVyZ2UsIGFlcyh4PXNjb3JlLCB5PWFzLm51bWVyaWMoUG9seXBoZW4yX0hWQVJfcmFua3Njb3JlKSkpKyBnZW9tX3BvaW50KGFscGhhID0gMC4yKSArIHhsYWIoIlZBTVAtc2VxIHNjb3JlIikreWxhYigiUG9seXBoZW4yIEhWQVIgcmFua3Njb3JlIikrZ2d0aXRsZSgiMy41IikgKyB0aGVtZV9idygpCgojQ0FERF9waHJlZCBub3Qgd29ydGgKCiNwbG90KHRwbXRfY29yNSkKI3Bsb3QodHBtdF9jb3IxKQojcGxvdCh0cG10X2NvcjEuNSkKcGxvdCh0cG10X2NvcjIpCnBsb3QodHBtdF9jb3IzKQpwbG90KHRwbXRfY29yMi41KQpwbG90KHRwbXRfY29yMy41KQpgYGAKYGBge3J9ClRQTVRfYWJ1bl9DQUREIDwtIGdncGxvdCh0cG10X21lcmdlLCBhZXMoeD1hYnVuZGFuY2VfY2xhc3MsIHk9Q0FERF9yYXdfcmFua3Njb3JlKSkgKyBnZW9tX3Zpb2xpbihkcmF3X3F1YW50aWxlcyA9IGMoIDAuNSkpK3lsYWIoIkNBREQgcmF3IHJhbmtzY29yZSIpK3hsYWIoIkFidW5kYW5jZSBDbGFzcyIpICsgdGhlbWVfYncoKQpwbG90KFRQTVRfYWJ1bl9DQUREKQoKVFBNVF9hYnVuX1NJRlRfY29udiA8LSBnZ3Bsb3QodHBtdF9tZXJnZSwgYWVzKHg9YWJ1bmRhbmNlX2NsYXNzLCB5PWFzLm51bWVyaWMoU0lGVF9jb252ZXJ0ZWRfcmFua3Njb3JlKSkpICsgZ2VvbV92aW9saW4oZHJhd19xdWFudGlsZXMgPSBjKDAuNSkpK3lsYWIoIlNJRlQgY29udiByYW5rc2NvcmUiKSt4bGFiKCJBYnVuZGFuY2UgQ2xhc3MiKSArIHRoZW1lX2J3KCkKcGxvdChUUE1UX2FidW5fU0lGVF9jb252KQoKVFBNVF9hYnVuX1BPTFkgPC0gZ2dwbG90KHRwbXRfbWVyZ2UsIGFlcyh4PWFidW5kYW5jZV9jbGFzcywgeT1hcy5udW1lcmljKFBvbHlwaGVuMl9IRElWX3JhbmtzY29yZSkpKSArIGdlb21fdmlvbGluKGRyYXdfcXVhbnRpbGVzID0gYyggMC41KSkreWxhYigiUG9seXBoZW4yIEhESVYgcmFua3Njb3JlIikreGxhYigiQWJ1bmRhbmNlIENsYXNzIikgKyB0aGVtZV9idygpCnBsb3QoVFBNVF9hYnVuX1BPTFkpCgpUUE1UX2FidW5fUE9MWTEgPC0gZ2dwbG90KHRwbXRfbWVyZ2UsIGFlcyh4PWFidW5kYW5jZV9jbGFzcywgeT1hcy5udW1lcmljKFBvbHlwaGVuMl9IVkFSX3JhbmtzY29yZSkpKSArIGdlb21fdmlvbGluKGRyYXdfcXVhbnRpbGVzID0gYyggMC41KSkreWxhYigiUG9seXBoZW4yIEhWQVIgcmFua3Njb3JlIikreGxhYigiQWJ1bmRhbmNlIENsYXNzIikgKyB0aGVtZV9idygpCnBsb3QoVFBNVF9hYnVuX1BPTFkxKQpgYGAKYGBge3J9ClByZWRfYWJ1bl9TSUZUIDwtIGdncGxvdCh0cG10X21lcmdlLCBhZXMoYWJ1bmRhbmNlX2NsYXNzKSkgKyBnZW9tX2JhcihhZXMoZmlsbCA9IFNJRlRfcHJlZCkpICsgZ2d0aXRsZSgiQWJ1bmRhbmNlIGNsYXNzIHZzIFNJRlQgcHJlZGljdGlvbiBvZiBEYW1hZ2luZyBvciBUb2xlcmF0ZWQiKSArIHRoZW1lX2J3KCkKcGxvdChQcmVkX2FidW5fU0lGVCkKCnRyaWFsX3NlcCA8LSB0cG10X21lcmdlW2MoMjEsMjMsMjQsMjYpXQp0cG10X21lcmdlX2V4cGFuZCA8LSBzZXBhcmF0ZV9yb3dzKHRwbXRfbWVyZ2UsIGMoIlBvbHlwaGVuMl9IRElWX3Njb3JlIiwgIlBvbHlwaGVuMl9IRElWX3ByZWQiLCAiUG9seXBoZW4yX0hWQVJfc2NvcmUiLCAiUG9seXBoZW4yX0hWQVJfcHJlZCIpKQoKUHJlZF9hYnVuX0hWQVIgPC0gZ2dwbG90KHRwbXRfbWVyZ2VfZXhwYW5kLCBhZXMoYWJ1bmRhbmNlX2NsYXNzKSkgKyBnZW9tX2JhcihhZXMoZmlsbCA9IFBvbHlwaGVuMl9IVkFSX3ByZWQpKSArIGdndGl0bGUoIkFidW5kYW5jZSBjbGFzcyB2cyBQb2x5cGhlbjIgSFZBUiBwcmVkaWN0aW9ucyIpICsgbGFicyhzdWJ0aXRsZSA9ICJEOiBQcm9iYWJseSBEYW1hZ2luZywgUDogUG9zc2libHkgRGFtYWdpbmcsIEI6IEJlbmlnbiIpICsgdGhlbWVfYncoKQpwbG90KFByZWRfYWJ1bl9IVkFSKQpgYGAKCmBgYHtyIGluY2x1ZGU9RkFMU0V9CiNjcmVhdGlvbiBvZiBiLXNjb3JlIHRleHQgZmlsZXMgZm9yIHB5bW9sIHVzZQpwdGVuX3B5bW9sIDwtIHN1bW1hcnlTRShwdGVuMV9kYXRhLCBtZWFzdXJldmFyPSJzY29yZSIsIGdyb3VwdmFycz0icG9zaXRpb24iLCBuYS5ybT1UUlVFKQojc2NvcmVbNDA0XSBpcyB3dAp3cml0ZS50YWJsZShwdGVuX3B5bW9sJHNjb3JlWzE6NDAzXSwgInB0ZW5fbWVhbl9zY29yZXNfcHltb2wudHh0Iiwgc2VwPSJcbiIsIHJvdy5uYW1lcz1GLCBjb2wubmFtZXM9RiwgbmEgPSAiTmFOIikKCnRwbXRfcHltb2wgPC0gc3VtbWFyeVNFKHRwbXQxX2RhdGEsIG1lYXN1cmV2YXI9InNjb3JlIiwgZ3JvdXB2YXJzPSJwb3NpdGlvbiIsIG5hLnJtPVRSVUUpCiNzY29yZVs0MDRdIGlzIHd0CndyaXRlLnRhYmxlKHRwbXRfcHltb2wkc2NvcmVbMToyNDVdLCAidHBtdF9tZWFuX3Njb3Jlc19weW1vbC50eHQiLCBzZXA9IlxuIiwgcm93Lm5hbWVzPUYsIGNvbC5uYW1lcz1GLCBuYSA9ICJOYU4iKQpgYGAKCmBgYHtyfQp0d2VudHlfY29sb3IxID0gYygiI0QwMjAyOCIsICIjQTRDMzNCIiwiIzUzOTU4QiIsICIjRTZBM0I0IiwgIiNDNUEwQ0EiLCAiIzU1NERBMCIsICIjOTkyNDdFIiwgIiM0MDIwNTkiLCAiIzgyNDIxQiIsICIjN0U4MDdFIiwgJ2JsYWNrJywgIiNFREQ5NDEiLCAiI0YyRjA4RSIsICIjRUVDODk4IiwgIiNFMUExMkYiLCAiIzc2QzE1OCIsICAiI0JDRERBRSIsICIjODU3ODJFIiwgIiMzMTU5MzUiLCAiI0ExREFFMCIsICIjNDg2RUI2IikKcHRlbl9kc3NwX3NjaGVtYXRpYzEgPC0gZ2dwbG90KCkgKwogIGdlb21fc2VnbWVudChhZXMoeCA9IDEsIHkgPSAwLCB4ZW5kID0gbWF4KHB0ZW5fZXh0cmEkcG9zaXRpb24pKSwgeWVuZCA9IDAsIHNpemUgPSAxLCBjb2xvciA9ICJncmV5NzAiKSArCiAgZ2VvbV9wb2ludChkYXRhID0gc3Vic2V0KHB0ZW5fZXh0cmEsICFpcy5uYSh4Y2EpKSwgYWVzKHggPSBwb3NpdGlvbiwgeSA9IDApLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAxLjgpICsKICBnZW9tX3BvaW50KGRhdGEgPSBzdWJzZXQocHRlbl9leHRyYSwgc2hlZXQgPT0gMSksIGFlcyh4ID0gcG9zaXRpb24sIHkgPSAwKSwgY29sb3IgPSAicGluayIsIHNpemUgPSAxLjUpICsKICBnZW9tX3BvaW50KGRhdGEgPSBzdWJzZXQocHRlbl9leHRyYSwgaGVsaXggPT0gMSksIGFlcyh4ID0gcG9zaXRpb24sIHkgPSAwKSwgY29sb3IgPSAiY3lhbiIsIHNpemUgPSAxLjUpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDQwMywgMjApLCBleHBhbmQgPSBjKDAsMCkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gTlVMTCwgZXhwYW5kID0gYygwLDApKSAreGxhYigiUG9zaXRpb24gaW4gUFRFTiIpICsgeWxhYigiXG4gXG4gXG4iKSArCiAgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9ibGFuaygpLCBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSkKCmFhcyA8LSBjKCJBIiwgIkMiLCAiUCIsICJYIikKYWFzMSA8LSBjKCJTIiwgIkMiLCAiUCIsICJYIikKYWFzMiA8LSBjKCJBIiwgIkMiLCAiRCIsICJFIiwgIkYiLCAiRyIsICJIIiwgIkkiLCAiSyIsICJMIiwgIk0iLCAiTiIsICJQIiwgIlEiLCAiUiIsICJTIiwgIlQiLCAiViIsICJXIiwgIlkiKQpwdGVuX2FfcG9zIDwtIGdncGxvdChkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBlbmQ9PSJBIiksIGFlcyh4PXBvc2l0aW9uLCB5PXNjb3JlLCBjb2xvdXI9c3RhcnQpKSsgZ2VvbV9wb2ludChkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBlbmQ9PSJBIiAmIHN0YXJ0ICVpbiUgYWFzMiksIHNpemU9LjYpICsgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz1zZXEoMCwgNDAzLCAyMCksIG1pbm9yX2JyZWFrcyA9IHNlcSgwLCA0MDMsIDUpLCBsaW1pdHMgPSBjKDAsIDQwMyksIGV4cGFuZCA9IGMoMCwwKSkgKyBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApLCBsaW1pdHMgPSBjKC0wLjI1LCAxLjUpKSArIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9dHdlbnR5X2NvbG9yMSkgK3lsYWIoIkFidW5kYW5jZSBzY29yZSIpK2xhYnMoY29sb3VyPSJSZWZlcmVuY2UgYW1pbm8gYWNpZCIpK3hsYWIoTlVMTCkrZ2d0aXRsZSgiQWJ1bmRhbmNlIHNjb3JlcyBvZiBBbGFuaW5lIHZhcmlhbnRzIikgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwgbGVnZW5kLnBvc2l0aW9uPSd0b3AnKSArIGdlb21faGxpbmUoeWludGVyY2VwdD0xLCBjb2xvcj0iYmxhY2siLCBzaXplPS4xKQojcGxvdChwdGVuX2FfcG9zKQoKcHRlbl9zX3BvcyA8LSBnZ3Bsb3QoZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgZW5kPT0iUyIpLCBhZXMoeD1wb3NpdGlvbiwgeT1zY29yZSwgY29sb3VyPXN0YXJ0KSkrIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgZW5kPT0iUyIgJiBzdGFydCAlaW4lIGFhczIpLCBzaXplPS42KSArIHNjYWxlX3hfY29udGludW91cyhicmVha3M9c2VxKDAsIDQwMywgMjApLCBtaW5vcl9icmVha3MgPSBzZXEoMCwgNDAzLCA1KSwgbGltaXRzID0gYygwLCA0MDMpLCBleHBhbmQgPSBjKDAsMCkpICsgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwgbGltaXRzID0gYygtMC4yNSwgMS41KSkgKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPXR3ZW50eV9jb2xvcjEpICt5bGFiKCJBYnVuZGFuY2Ugc2NvcmUiKStsYWJzKGNvbG91cj0iUmVmZXJlbmNlIGFtaW5vIGFjaWQiKSt4bGFiKE5VTEwpK2dndGl0bGUoIkFidW5kYW5jZSBzY29yZXMgb2YgU2VyaW5lIHZhcmlhbnRzIikgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwgbGVnZW5kLnBvc2l0aW9uPSd0b3AnKSArIGdlb21faGxpbmUoeWludGVyY2VwdD0xLCBjb2xvcj0iYmxhY2siLCBzaXplPS4xKQoKcHRlbl9jX3BvcyA8LSBnZ3Bsb3QoZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgZW5kPT0iQyIpLCBhZXMoeD1wb3NpdGlvbiwgeT1zY29yZSwgY29sb3VyPXN0YXJ0KSkrIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgZW5kPT0iQyIgJiBzdGFydCAlaW4lIGFhczIpLCBzaXplPS42KSArIHNjYWxlX3hfY29udGludW91cyhicmVha3M9c2VxKDAsIDQwMywgMjApLCBtaW5vcl9icmVha3MgPSBzZXEoMCwgNDAzLCA1KSwgbGltaXRzID0gYygwLCA0MDMpLCBleHBhbmQgPSBjKDAsMCkpICsgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwgbGltaXRzID0gYygtMC4yNSwgMS41KSkgKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPXR3ZW50eV9jb2xvcjEpICt5bGFiKCJBYnVuZGFuY2Ugc2NvcmUiKStsYWJzKGNvbG91cj0iUmVmZXJlbmNlIGFtaW5vIGFjaWQiKSt4bGFiKE5VTEwpK2dndGl0bGUoIkFidW5kYW5jZSBzY29yZXMgb2YgQ3lzdGVpbmUgdmFyaWFudHMiKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLCBsZWdlbmQucG9zaXRpb249J3RvcCcpICsgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTEsIGNvbG9yPSJibGFjayIsIHNpemU9LjEpCgoKcHRlbl94X3BvcyA8LSBnZ3Bsb3QoZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgZW5kPT0iWCIpLCBhZXMoeD1wb3NpdGlvbiwgeT1zY29yZSwgY29sb3VyPXN0YXJ0KSkrIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgZW5kPT0iWCIgJiBzdGFydCAlaW4lIGFhczIpLCBzaXplPS42KSArIHNjYWxlX3hfY29udGludW91cyhicmVha3M9c2VxKDAsIDQwMywgMjApLCBtaW5vcl9icmVha3MgPSBzZXEoMCwgNDAzLCA1KSwgbGltaXRzID0gYygwLCA0MDMpLCBleHBhbmQgPSBjKDAsMCkpICsgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwgbGltaXRzID0gYygtMC4yNSwgMS41KSkgKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPXR3ZW50eV9jb2xvcjEpICt5bGFiKCJBYnVuZGFuY2Ugc2NvcmUiKStsYWJzKGNvbG91cj0iUmVmZXJlbmNlIGFtaW5vIGFjaWQiKSt4bGFiKE5VTEwpK2dndGl0bGUoIkFidW5kYW5jZSBzY29yZXMgb2Ygbm9uc2Vuc2UgdmFyaWFudHMiKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLCBsZWdlbmQucG9zaXRpb249J3RvcCcpICsgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTEsIGNvbG9yPSJibGFjayIsIHNpemU9LjEpCgpncmlkLm5ld3BhZ2UoKQpncmlkLmRyYXcocmJpbmQoZ2dwbG90R3JvYihwdGVuX2FfcG9zKSwgZ2dwbG90R3JvYihwdGVuX2Rzc3Bfc2NoZW1hdGljMSksIHNpemUgPSAibGFzdCIpKQpncmlkLm5ld3BhZ2UoKQpncmlkLmRyYXcocmJpbmQoZ2dwbG90R3JvYihwdGVuX3NfcG9zKSwgZ2dwbG90R3JvYihwdGVuX2Rzc3Bfc2NoZW1hdGljMSksIHNpemUgPSAibGFzdCIpKQpncmlkLm5ld3BhZ2UoKQpncmlkLmRyYXcocmJpbmQoZ2dwbG90R3JvYihwdGVuX2NfcG9zKSwgZ2dwbG90R3JvYihwdGVuX2Rzc3Bfc2NoZW1hdGljMSksIHNpemUgPSAibGFzdCIpKQpncmlkLm5ld3BhZ2UoKQpncmlkLmRyYXcocmJpbmQoZ2dwbG90R3JvYihwdGVuX3hfcG9zKSwgZ2dwbG90R3JvYihwdGVuX2Rzc3Bfc2NoZW1hdGljMSksIHNpemUgPSAibGFzdCIpKQpgYGAKYGBge3J9CiNzbmFrZSBhdCB0aGUgZW5kIChhcmNoZXMgb3ZlciBncmV5IHJlZ2lvbikKcHRlbl9wX3BvcyA8LSBnZ3Bsb3QoZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgZW5kPT0iUCIpLCBhZXMoeD1wb3NpdGlvbiwgeT1zY29yZSwgY29sb3VyPXN0YXJ0KSkrIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgZW5kPT0iUCIgJiBzdGFydCAlaW4lIGFhczIpLCBzaXplPS42KSArIHNjYWxlX3hfY29udGludW91cyhicmVha3M9c2VxKDAsIDQwMywgMjApLCBtaW5vcl9icmVha3MgPSBzZXEoMCwgNDAzLCA1KSwgbGltaXRzID0gYygwLCA0MDMpLCBleHBhbmQgPSBjKDAsMCkpICsgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwgbGltaXRzID0gYygtMC4yNSwgMS41KSkgKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPXR3ZW50eV9jb2xvcjEpICt5bGFiKCJBYnVuZGFuY2Ugc2NvcmUiKStsYWJzKGNvbG91cj0iUmVmZXJlbmNlIGFtaW5vIGFjaWQiKSt4bGFiKE5VTEwpK2dndGl0bGUoIkFidW5kYW5jZSBzY29yZXMgb2YgUHJvbGluZSB2YXJpYW50cyIpICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksIGxlZ2VuZC5wb3NpdGlvbj0ndG9wJykgKyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9MSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0uMSkKZ3JpZC5uZXdwYWdlKCkKZ3JpZC5kcmF3KHJiaW5kKGdncGxvdEdyb2IocHRlbl9wX3BvcyksIGdncGxvdEdyb2IocHRlbl9kc3NwX3NjaGVtYXRpYzEpLCBzaXplID0gImxhc3QiKSkKYGBgCmBgYHtyfQojbWF0Y2hpbmcgc25ha2UgYXQgdGhlIGVuZCEKcHRlbl9nX3BvcyA8LSBnZ3Bsb3QoZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgZW5kPT0iRyIpLCBhZXMoeD1wb3NpdGlvbiwgeT1zY29yZSwgY29sb3VyPXN0YXJ0KSkrIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgZW5kPT0iRyIgJiBzdGFydCAlaW4lIGFhczIpLCBzaXplPS42KSArIHNjYWxlX3hfY29udGludW91cyhicmVha3M9c2VxKDAsIDQwMywgMjApLCBtaW5vcl9icmVha3MgPSBzZXEoMCwgNDAzLCA1KSwgbGltaXRzID0gYygwLCA0MDMpLCBleHBhbmQgPSBjKDAsMCkpICsgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwgbGltaXRzID0gYygtMC4yNSwgMS41KSkgKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPXR3ZW50eV9jb2xvcjEpICt5bGFiKCJBYnVuZGFuY2Ugc2NvcmUiKStsYWJzKGNvbG91cj0iUmVmZXJlbmNlIGFtaW5vIGFjaWQiKSt4bGFiKE5VTEwpK2dndGl0bGUoIkFidW5kYW5jZSBzY29yZXMgb2YgR2x5Y2luZSB2YXJpYW50cyIpICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksIGxlZ2VuZC5wb3NpdGlvbj0ndG9wJykgKyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9MSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0uMSkKZ3JpZC5uZXdwYWdlKCkKZ3JpZC5kcmF3KHJiaW5kKGdncGxvdEdyb2IocHRlbl9nX3BvcyksIGdncGxvdEdyb2IocHRlbl9kc3NwX3NjaGVtYXRpYzEpLCBzaXplID0gImxhc3QiKSkKCnB0ZW5faF9wb3MgPC0gZ2dwbG90KGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIGVuZD09IkgiKSwgYWVzKHg9cG9zaXRpb24sIHk9c2NvcmUsIGNvbG91cj1zdGFydCkpKyBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIGVuZD09IkgiICYgc3RhcnQgJWluJSBhYXMyKSwgc2l6ZT0uNikgKyBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPXNlcSgwLCA0MDMsIDIwKSwgbWlub3JfYnJlYWtzID0gc2VxKDAsIDQwMywgNSksIGxpbWl0cyA9IGMoMCwgNDAzKSwgZXhwYW5kID0gYygwLDApKSArIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCksIGxpbWl0cyA9IGMoLTAuMjUsIDEuNSkpICsgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz10d2VudHlfY29sb3IxKSAreWxhYigiQWJ1bmRhbmNlIHNjb3JlIikrbGFicyhjb2xvdXI9IlJlZmVyZW5jZSBhbWlubyBhY2lkIikreGxhYihOVUxMKStnZ3RpdGxlKCJBYnVuZGFuY2Ugc2NvcmVzIG9mIEhpc3RpZGluZSB2YXJpYW50cyIpICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksIGxlZ2VuZC5wb3NpdGlvbj0ndG9wJykgKyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9MSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0uMSkKZ3JpZC5uZXdwYWdlKCkKZ3JpZC5kcmF3KHJiaW5kKGdncGxvdEdyb2IocHRlbl9oX3BvcyksIGdncGxvdEdyb2IocHRlbl9kc3NwX3NjaGVtYXRpYzEpLCBzaXplID0gImxhc3QiKSkKCiMybmQgZnJvbSBsYXN0IGdyZXkgcmVnaW9uCnB0ZW5fd19wb3MgPC0gZ2dwbG90KGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIGVuZD09IlciKSwgYWVzKHg9cG9zaXRpb24sIHk9c2NvcmUsIGNvbG91cj1zdGFydCkpKyBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIGVuZD09IlciICYgc3RhcnQgJWluJSBhYXMyKSwgc2l6ZT0uNikgKyBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPXNlcSgwLCA0MDMsIDIwKSwgbWlub3JfYnJlYWtzID0gc2VxKDAsIDQwMywgNSksIGxpbWl0cyA9IGMoMCwgNDAzKSwgZXhwYW5kID0gYygwLDApKSArIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCksIGxpbWl0cyA9IGMoLTAuMjUsIDEuNSkpICsgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz10d2VudHlfY29sb3IxKSAreWxhYigiQWJ1bmRhbmNlIHNjb3JlIikrbGFicyhjb2xvdXI9IlJlZmVyZW5jZSBhbWlubyBhY2lkIikreGxhYihOVUxMKStnZ3RpdGxlKCJBYnVuZGFuY2Ugc2NvcmVzIG9mIFR5cHRvcGhhbiB2YXJpYW50cyIpICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksIGxlZ2VuZC5wb3NpdGlvbj0ndG9wJykgKyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9MSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0uMSkKZ3JpZC5uZXdwYWdlKCkKZ3JpZC5kcmF3KHJiaW5kKGdncGxvdEdyb2IocHRlbl93X3BvcyksIGdncGxvdEdyb2IocHRlbl9kc3NwX3NjaGVtYXRpYzEpLCBzaXplID0gImxhc3QiKSkKYGBgCmBgYHtyfQoKYGBgCgoK